web-dev-qa-db-ja.com

AsyncTask onPostExecuteが呼び出されることはありません

何が間違っているのかわかりませんが、onPostExecuteが呼び出されることはありません。

  • BaseActivity.Javaという基本クラスを作成しました
  • 元のアクティビティからこのクラスを拡張しました。
  • BaseActivity内にPostToOpenFeintクラスを配置しました
  • 私がやっているメインアクティビティから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スレッドから呼び出しています。

39
ddavtian

今、似たような問題がありました。 AsyncTask<Integer,Integer,Integer>を拡張していましたが、onPostExecuteメソッドは次のようになりました。

protected void onPostExecute(int result)

これは私には良さそうに思えましたが、それでもJava guy ..に変更しました。

protected void onPostExecute(Integer result)

何らかの理由でJavaはintInteger?の間に違いがあると考えているためです

あなたの問題は、あなたの戻り値の型をvoidとして宣言していることだと思います:

extends<Void,Void,Void>

つまり、パラメーターも進捗も結果もありません。完了したときに何かを実行したい場合は、整数やブール値などの何らかの値を与える必要があると思います。

Extendを変更する場合:

<Void,Void,Integer>

パラメータを渡さず、進捗を公開せず、値を返します。 onPostExecuteメソッドを変更して、Integerを受け入れます。

protected void onPostExecute(Integer result)

次に、doInBackgroundメソッドの戻り値を次のように変更します。

return 1;

その後、実行されます。

73
Tom E.

AsyncTasksについてもう1つ注意すべき点があります。私はちょうど半日を過ごしました。

AsyncTaskクラスをUIスレッドにロードする必要があります。これはJELLY_BEANの時点で自動的に行われます。

ドキュメントを言います。ジンジャーブレッド(およびおそらく以前)では、適切な状況を考えると、これによりonPostExecuteが実行されなくなります。ただし、解決策は簡単です。

new MyAsyncTask();

uIスレッドの早い段階で、バックグラウンドで何かが誤ってロードされる前にクラスがロードされるようにします。

バックグラウンドスレッドからAsyncTaskサブクラスで静的関数を使用していましたが、これは、タイミングに応じて、AsyncTaskサブクラスとNice Heisenbugであるbingoを使用するUIスレッドの前に呼び出されました。

(すでに回答済みのこの古い質問に答えてくれましたが、その情報がどこにも見つからなかったので、これが私の最初の投稿です)

12
Christian Mock

cancel()でタスクをキャンセルする の場合、onPostExecute()は呼び出されないことに注意してください。かなり論理的ですが、そのメソッドの呼び出しを見落とすだけで困惑していました。

9
Paul Lammertsma

私の問題は、どういうわけかonPostExecuteメソッドを正しく@Overrideしなかったことです。マウスの右ボタン->ソース-> Override\Implementメソッドをクリックして修正しました。

それが誰かを助けることを願っています

7
Oz Radiano

たぶん、doInBackground()のコードが戻らないのでしょうか?

2
Kevin Gaudin

これをアクティビティのコードに追加するだけです。非同期タスクの問題は、本来のように適切に初期化されないことです。

          try {
                Class.forName("Android.os.AsyncTask");
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
1
Rajesh Narwal

OnPostExecuteで適切なパラメーターを使用し、public void onPostExecute(boolean response){}の代わりにpublic void onPostExecute(Boolean response){}を使用するだけで問題が解決しました。

0
vinaya

OnPostExecuteのパラメーターを変更するだけです

@Override
protected void onPostExecute(Void unused) {
...}

これでメソッドが呼び出されます。

0

nullではなく、returnだけで機能します!
例えば:
return "done";

0
Yasser Akbbach