web-dev-qa-db-ja.com

完了後にonPostExecuteが呼び出されないAsyncTask

何らかの理由で、AsyncTaskが終了した後、onPostExecute()が呼び出されません。

私のクラスの宣言:

_public class setWallpaperForeground extends AsyncTask<String, Integer, Boolean>_

私のonPostExecute():

protected void onPostExecute(Boolean result)

すべてが正常に動作し、私のdoInBackground()は正常に完了し、ブール値を返しますが、その後は終了します。

ありがとう

35
mlevit

UIスレッドでAsyncTaskを作成しましたか?また、onPostExecute()メソッドに@Overrideアノテーションを追加して、正しく宣言されていることを確認します。

48
Romain Guy

execute()メソッドでタスクを開始しましたか? onPostExecuteを呼び出すだけでは、doInBackgroundは実行されません。

52

別の厄介な間違いを発見/作成:

onPostExecute(Param param)のパラメーターがextends AsyncTask<...,...,Param>で定義したパラメーターと一致せず、@Overrideアノテーションを使用しなかった場合、パラメーターは実行されず、取得されませんEclipseからの警告。

自分への注意:常に@Overrideアノテーションを使用するだけで、Eclipseが役立ちます。

すべての名前の間違いを回避する別の簡単な方法:

eclipseの場合:Right-click in code > Source > Override/Implement Methods

30
trichner

同じ問題が発生し、これらの回答がどれも役に立たなかった後、UIスレッドがブロックされていることがわかりました( CountDownLatch.await() を使用したため)onPostExecute() UIスレッドによって呼び出されることになっているメソッドは呼び出されませんでした。

4
Hadas Kaminsky

私は同じ問題に直面しました。上記の解決策のどれも私にとってはうまくいきませんでした。それから私は問題を他の誰かに役立つかもしれないと考えました。

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と無限ループは両方とも、お互いが終了するのを待ちます。したがって、コードがスタックします!

解決策はデザインを変えることです!

2
oiyio

この同じエラーを引き起こす可能性のある別の厄介な間違いを犯しました。 AsyncTaskを定義して呼び出すとき、executeを呼び出すのではなく、doInBackgroundを呼び出していました

new AsyncTask<String,Void,Void>() {
    ....
}.doInBackground("parameter");

のではなく

new AsyncTask<String,Void,Void>() {
    ....
}.execute("parameter");
2
Anarchofascist

私は同じ振る舞いをしていましたが、原因はdoInBackground内で進行状況として次のコードで多くのメッセージを投稿していたことです。

new Handler(Looper.getMainLooper()).post(new Runnable() {
   @Override
   public void run() {
     // .. some UI updates
   }
});

これには、メイントラッドメッセージキューがオーバーロードされている必要があり、onPostExecuteが呼び出されるまでに長い遅延が発生していました。解決策は、毎秒1回だけ投稿することでした。

1
marcinj

私にとってはユーザーエラーでした。私はAsyncTaskをcancel(true)を呼び出して終了しましたが、onPostExecuteがこの場合呼び出されないこと、onCancelledが呼び出されることを知るのに十分なほどドキュメントを読みませんでした。

0
AlanKley