何らかの理由で、AsyncTask
が終了した後、onPostExecute()
が呼び出されません。
私のクラスの宣言:
_public class setWallpaperForeground extends AsyncTask<String, Integer, Boolean>
_
私のonPostExecute():
protected void onPostExecute(Boolean result)
すべてが正常に動作し、私のdoInBackground()
は正常に完了し、ブール値を返しますが、その後は終了します。
ありがとう
UIスレッドでAsyncTaskを作成しましたか?また、onPostExecute()メソッドに@Overrideアノテーションを追加して、正しく宣言されていることを確認します。
execute()
メソッドでタスクを開始しましたか? onPostExecute
を呼び出すだけでは、doInBackground
は実行されません。
onPostExecute(Param param)
のパラメーターがextends AsyncTask<...,...,Param>
で定義したパラメーターと一致せず、@Override
アノテーションを使用しなかった場合、パラメーターは実行されず、取得されませんEclipseからの警告。
自分への注意:常に@Override
アノテーションを使用するだけで、Eclipseが役立ちます。
eclipseの場合:Right-click in code > Source > Override/Implement Methods
同じ問題が発生し、これらの回答がどれも役に立たなかった後、UIスレッドがブロックされていることがわかりました( CountDownLatch.await()
を使用したため)onPostExecute()
UIスレッドによって呼び出されることになっているメソッドは呼び出されませんでした。
私は同じ問題に直面しました。上記の解決策のどれも私にとってはうまくいきませんでした。それから私は問題を他の誰かに役立つかもしれないと考えました。
UIスレッドでは、次のコードを呼び出します。
public class XActivity ...{
onCreate(){
....
new SaveDrawingAsync(this).execute();
while(true)
{
if(MandalaActivity.saveOperationInProgress){
continue;
}
super.onBackPressed();
break;
}
...
}
}
私のAsyncTaskクラスの定義:
public class SaveAsync extends AsyncTask<Object, Void, Void> {
@Override
public Void doInBackground(Object... params) {
saveThem(); // long running operation
return null;
}
@Override
public void onPostExecute(Void param) {
XActivity.saveOperationInProgress = false;
}
@Override
public void onPreExecute() {
XActivity.saveOperationInProgress = true;
}
}
上記のコードでは、onPostExecuteは呼び出されません。 asynctask実行後の無限ループが原因です。 asynctaskと無限ループは両方とも、お互いが終了するのを待ちます。したがって、コードがスタックします!
解決策はデザインを変えることです!
この同じエラーを引き起こす可能性のある別の厄介な間違いを犯しました。 AsyncTaskを定義して呼び出すとき、execute
を呼び出すのではなく、doInBackground
を呼び出していました
new AsyncTask<String,Void,Void>() {
....
}.doInBackground("parameter");
のではなく
new AsyncTask<String,Void,Void>() {
....
}.execute("parameter");
私は同じ振る舞いをしていましたが、原因はdoInBackground内で進行状況として次のコードで多くのメッセージを投稿していたことです。
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
// .. some UI updates
}
});
これには、メイントラッドメッセージキューがオーバーロードされている必要があり、onPostExecuteが呼び出されるまでに長い遅延が発生していました。解決策は、毎秒1回だけ投稿することでした。
私にとってはユーザーエラーでした。私はAsyncTaskをcancel(true)を呼び出して終了しましたが、onPostExecuteがこの場合呼び出されないこと、onCancelledが呼び出されることを知るのに十分なほどドキュメントを読みませんでした。