onPostExecute が完了後に呼び出されない AsyncTask
-
25-09-2019 - |
質問
なぜか私の onPostExecute()
私の名前にちなんで呼ばれません AsyncTask
終わります。
私のクラス宣言:
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)
のあなたのparamsは、あなたがextends AsyncTask<...,...,Param>
で定義され、あなたが@Override
アノテーションを使用しなかったものと一致しない場合は、
、それが実行されることはありません、あなたは、Eclipseからの警告を得ることはありません。
自分自身への注:
ただ、常に@Override
アノテーションを使用し、Eclipseがお手伝いを致します。
もう一つの簡単な方法:
Eclipseの:Right-click in code > Source > Override/Implement Methods
同じ問題が発生し、これらの回答がどれも役に立たなかった後、UI スレッドがブロックされていることがわかりました ( CountDownLatch.await()
) したがって、 onPostExecute()
UI スレッドによって呼び出されるはずのメソッドが呼び出されませんでした。
は、この同じエラーが発生する可能性があり、別の厄介なミスを犯しました。 AsyncTaskを定義し、それを呼び出すとき、私はexecute
を呼び出していませんでしたが、doInBackground
を呼んでいた。
new AsyncTask<String,Void,Void>() {
....
}.doInBackground("parameter");
ではなく
new AsyncTask<String,Void,Void>() {
....
}.execute("parameter");
私は同じ問題に直面しています。上記の解決策のどれも私のために働いていません。それから私は多分それは他の誰かを助け、問題を考え出します。
私は以下のコードを呼び出すでは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とinifiniteループ互いに仕上げの両方を待ちます。このように、コードstucks!
ソリューションは、設計を変更している!
私は同じ動作を持っていた、その原因は、私は次のコードでdoInBackground内部の進歩として多くのメッセージを投稿してきたということでした。
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
// .. some UI updates
}
});
これは、メインthradメッセージキューをオーバーロードし、そしてonPostExecuteと呼ばれるになるだろう前に、長時間の遅延の原因となっている必要があります。ソリューションは、毎秒一度のみ投稿することでした。
私にとっては、ユーザー・エラーでした。私はonCancelledがある、それを(真の)キャンセル呼び出すことにより、AsyncTaskを終了し、onPostExecuteが、この場合には呼び出されないことを知って密接に十分なドキュメントを読んでいませんでした。