何が間違っているのかわかりませんが、onPostExecuteが呼び出されることはありません。
私がやっているメインアクティビティからUIスレッドからそれを呼び出しました:
new PostToOpenFeint.execute();
OnPreExecute()、doInBackground(..)がトリガーされますが、何らかの理由でonPostExecuteが呼び出されることはありません。
前もって感謝します!
デイブ
private class PostToOpenFeint extends AsyncTask<Void, Void, Void> {
/*
* (non-Javadoc)
*
* @see Android.os.AsyncTask#doInBackground(Params[])
*/
@Override
protected Void doInBackground(Void... params) {
// does all the work here
return null;
}
/*
* (non-Javadoc)
*
* @see Android.os.AsyncTask#onPostExecute(Java.lang.Object)
*/
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
Toast.makeText(MainScreen.this, "Done syncing", Toast.LENGTH_LONG).show();
}
/*
* (non-Javadoc)
*
* @see Android.os.AsyncTask#onPreExecute()
*/
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
Toast.makeText(MainScreen.this, "About to sync all your scores", Toast.LENGTH_LONG).show();
}
さらに調べてみると、これは私が観察できたものです。例えば、私がこの電話をかけると:
new PostToOpenFeint.execute();
アクティビティのonCreateの直後に、すべてが正常に機能します。この呼び出しをボタンリスナー内に配置するとします。
settingsButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
new PostToOpenFeint.execute();
}
});
OnPostExecute()が呼び出されることはなく、何が間違っているのかわかりません。私が読んだ制限は、UIスレッドからこれを呼び出すことであり、UIスレッドから呼び出しています。
今、似たような問題がありました。 AsyncTask<Integer,Integer,Integer>
を拡張していましたが、onPostExecuteメソッドは次のようになりました。
protected void onPostExecute(int result)
これは私には良さそうに思えましたが、それでもJava guy ..に変更しました。
protected void onPostExecute(Integer result)
何らかの理由でJavaはint
とInteger
?の間に違いがあると考えているためです
あなたの問題は、あなたの戻り値の型をvoid
として宣言していることだと思います:
extends<Void,Void,Void>
つまり、パラメーターも進捗も結果もありません。完了したときに何かを実行したい場合は、整数やブール値などの何らかの値を与える必要があると思います。
Extendを変更する場合:
<Void,Void,Integer>
パラメータを渡さず、進捗を公開せず、値を返します。 onPostExecute
メソッドを変更して、Integer
を受け入れます。
protected void onPostExecute(Integer result)
次に、doInBackground
メソッドの戻り値を次のように変更します。
return 1;
その後、実行されます。
AsyncTasksについてもう1つ注意すべき点があります。私はちょうど半日を過ごしました。
AsyncTaskクラスをUIスレッドにロードする必要があります。これはJELLY_BEANの時点で自動的に行われます。
ドキュメントを言います。ジンジャーブレッド(およびおそらく以前)では、適切な状況を考えると、これによりonPostExecute
が実行されなくなります。ただし、解決策は簡単です。
new MyAsyncTask();
uIスレッドの早い段階で、バックグラウンドで何かが誤ってロードされる前にクラスがロードされるようにします。
バックグラウンドスレッドからAsyncTaskサブクラスで静的関数を使用していましたが、これは、タイミングに応じて、AsyncTaskサブクラスとNice Heisenbugであるbingoを使用するUIスレッドの前に呼び出されました。
(すでに回答済みのこの古い質問に答えてくれましたが、その情報がどこにも見つからなかったので、これが私の最初の投稿です)
cancel()
でタスクをキャンセルする の場合、onPostExecute()
は呼び出されないことに注意してください。かなり論理的ですが、そのメソッドの呼び出しを見落とすだけで困惑していました。
私の問題は、どういうわけかonPostExecuteメソッドを正しく@Overrideしなかったことです。マウスの右ボタン->ソース-> Override\Implementメソッドをクリックして修正しました。
それが誰かを助けることを願っています
たぶん、doInBackground()のコードが戻らないのでしょうか?
これをアクティビティのコードに追加するだけです。非同期タスクの問題は、本来のように適切に初期化されないことです。
try {
Class.forName("Android.os.AsyncTask");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
OnPostExecuteで適切なパラメーターを使用し、public void onPostExecute(boolean response){}の代わりにpublic void onPostExecute(Boolean response){}を使用するだけで問題が解決しました。
OnPostExecuteのパラメーターを変更するだけです
@Override
protected void onPostExecute(Void unused) {
...}
これでメソッドが呼び出されます。
nullではなく、returnだけで機能します!
例えば:return "done";