wake-up-neo.com

AsyncTask onPostExecute wird nie aufgerufen

Ich bin nicht sicher, was ich falsch mache, aber onPostExecute wird nie aufgerufen.

  • Eine Basisklasse mit dem Namen BaseActivity.Java wurde erstellt
  • Von meiner ursprünglichen Aktivität habe ich diese Klasse erweitert.
  • Die PostToOpenFeint-Klasse wurde in BaseActivity platziert
  • Ich habe es aus dem UI-Thread aus der Hauptaktivität aufgerufen: 

    new PostToOpenFeint.execute();
    

Das onPreExecute (), doInBackground (..) wird ausgelöst, aber aus irgendeinem Grund wird das onPostExecute nie aufgerufen.

Danke im Voraus!

Dave

 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();
  }

Bei näherer Betrachtung konnte ich dies beobachten. Zum Beispiel, wenn ich diesen Anruf tätige: 

 new PostToOpenFeint.execute();

gleich nach dem Erstellen der Aktivität funktioniert alles gut. Wenn ich diesen Anruf stelle, sage ich in einen Button Listener.

settingsButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
   new PostToOpenFeint.execute();
}
});

OnPostExecute () wird nie aufgerufen, ist mir nicht sicher, was ich falsch mache. Die Einschränkung, die ich gelesen habe, bestand darin, dies vom UI-Thread aus aufzurufen, und ich rufe es vom UI-Thread.

39
ddavtian

Ich hatte gerade ein ähnliches Problem. Ich erweiterte AsyncTask<Integer,Integer,Integer> und meine onPostExecute-Methode sah folgendermaßen aus:

protected void onPostExecute(int result)

Dies schien mir in Ordnung zu sein, aber andererseits bin ich eher ein .NET-Typ als ein Java-Typ ... Ich habe ihn geändert in:

protected void onPostExecute(Integer result)

weil aus irgendeinem Grund Java denkt, dass es einen Unterschied zwischen int und Integer gibt?

Ich denke, Ihr Problem besteht darin, dass Sie den Rückgabetyp in Ihrem als void deklarieren:

extends<Void,Void,Void>

Das bedeutet keine Parameter, kein Fortschritt und kein Ergebnis. Wenn Sie etwas ausführen wollen, wenn es fertig ist, denke ich, müssen Sie ihm einen Wert wie Integer oder einen Boolean geben.

Wenn Sie Ihre Erweiterungen ändern:

<Void,Void,Integer>

Jetzt übergeben Sie keine Parameter, veröffentlichen keinen Fortschritt, sondern geben einen Wert zurück. Ändern Sie Ihre onPostExecute-Methode, um eine Integer zu akzeptieren:

protected void onPostExecute(Integer result)

Ändern Sie dann die Rückgabe in Ihrer doInBackground-Methode in Folgendes:

return 1;

Dann sollte es für Sie ausgeführt werden.

73
Tom E.

Es gibt noch ein Problem mit AsyncTasks, an dem ich gerade den halben Tag verbracht habe:

Die AsyncTask-Klasse muss in den UI-Thread geladen werden. Das ist fertig automatisch ab JELLY_BEAN.

Sagt die Dokumentation. Bei Lebkuchen (und wahrscheinlich davor) führt dies unter den richtigen Umständen dazu, dass onPostExecute nicht ausgeführt wird. Die Lösung ist jedoch einfach, nur eine 

new MyAsyncTask();

früh im UI-Thread, so dass die Klasse geladen wird, bevor etwas im Hintergrund unbeabsichtigt geladen werden kann.

Ich hatte in meiner AsyncTask-Unterklasse eine statische Funktion aus einem Hintergrund-Thread verwendet, der abhängig vom Timing aufgerufen wurde, bevor der UI-Thread etwas verwendete, das die AsyncTask-Unterklasse verwendete, und Bingo, ein Nice Heisenbug.

(Tragen Sie sich bitte mit mir für die Beantwortung dieser alten, bereits beantworteten Frage ein, aber ich habe nirgendwo diesen Hinweis auf Informationen gefunden, und dies ist mein erster Beitrag.)

12
Christian Mock

Beachten Sie, dass wenn Sie die Aufgabe über cancel() abbrechen, onPostExecute() nicht aufgerufen wird. Ziemlich logisch, aber einen Anruf dieser Methode einfach zu übersehen, hatte mich stumm gemacht.

9
Paul Lammertsma

Mein Problem war, dass ich die onPostExecute-Methode irgendwie nicht korrekt überschrieb. Das Problem wurde behoben, indem Sie mit der rechten Maustaste-> Quelle-> Überschreiben\Implementieren-Methode klicken.

Hoffentlich hilft es jemandem

7
Oz Radiano

Vielleicht wird der Code in doInBackground () nie zurückgegeben?

2
Kevin Gaudin

Fügen Sie dies einfach zu Ihrer Aktivität hinzu. Es ist das Problem, dass Async Task nicht ordnungsgemäß initialisiert wird.

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

Verwenden Sie einfach die richtigen Parameter in onPostExecute, benutzen public void onPostExecute (boolesche Antwort) {} statt public void onPostExecute (boolesche Antwort) {} Dadurch wurde mein Problem gelöst

0
vinaya

Ändern Sie einfach die Parameter in onPostExecute

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

Nun sollte die Methode aufgerufen werden. 

0

Einfach return etwas anderes als null und es wird funktionieren!
z.B:
return "done";

0
Yasser Akbbach