Triggerereignis, wenn AsyncTask mit dem Listener fertig ist

Ich habe einige Verwirrung darüber, wie man Hörer benutzt, um Informationen zwischen Klassen und Aktivitäten weiterzugeben.

Das Szenario ist das:
Ich habe eine Aufgabe, die Daten aus einer Sqlite-Datenbank liest und diese Daten in eine ArrayList übergibt, die an einen Adapter übergeben wird, der sie dann auf dem Bildschirm anzeigt.

Die Frage:
Meine App stürzt ab, wenn ich versuche, die Listener-Schnittstelle mit einem Wert zu aktualisieren. Es zeigt nichts in der Logcat … es hängt einfach die App. Kann jemand irgendwie darauf hinweisen, wo ich falsch gehe. – Vielen Dank

Details:
Ich habe die Datenbank Verarbeitung von einer Klasse namens DatbaseRoutines und in ihm eine innere Methode, die das schwere Heben. Die Methode verwendet AsyncTask, um den Hauptfaden nicht zu schwenken.

Ich habe erstellt und Schnittstelle mit einer einzigen Methode

public interface DatabaseProcessListener { public void ProcessingIsDone(boolean blnProcessIsFinished); } 

In meiner DatabaseRoutines Klasse schreibe ich eine private Variable

 private DatabaseProcessListener dbProcesslistener; 

Zusammen mit einem setzer für sie

  public void setDbProcesslistener(DatabaseProcessListener dbProcesslistener) { this.dbProcesslistener = dbProcesslistener; } 

Wenn die Verarbeitung durchgeführt wird, verwende ich die PostExecute-Methode, um den Listener zu aktualisieren, damit dies den Wert im Zuhörer auf True ändern kann (dh, dass die db-Verarbeitung fertig ist) unten ist der Code

  protected void onPostExecute(Boolean aBoolean) { super.onPostExecute(aBoolean); dialog.dismiss(); //i have progress dialog during processing and its //closed here if (blnUpdateSucceededStatus) { dbProcesslistener.ProcessingIsDone(true); } else { Toast.makeText(ctx, "Transactions Processing failed",Toast.LENGTH_SHORT); } ; 

Schließlich in der Aktivität, die die aus der Datenbank gesammelten Daten anzeigt, implementiere ich den Zuhörer. siehe unten.

 public class MyActivity extends Activity implements DatabaseProcessListener { @Override public void ProcessingIsDone(boolean blnProcessIsFinished) { if(blnProcessIsFinished){ PopulateExpandableListView(); } public void PopulateExpandableListView() { //code for populating the listview goes here; } } 

Nach einigen graben fand ich den logcat error..its eine nullpointer ausnahme

 05-05 11:11:18.590: ERROR/AndroidRuntime(22339): FATAL EXCEPTION: main java.lang.NullPointerException at com.example.mledger.DatabaseRoutines$1.onPostExecute(DatabaseRoutines.java:258) at com.example.mledger.DatabaseRoutines$1.onPostExecute(DatabaseRoutines.java:141) at android.os.AsyncTask.finish(AsyncTask.java:631) at android.os.AsyncTask.access$600(AsyncTask.java:177) at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4921) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) at dalvik.system.NativeStart.main(Native Method) 

Leider hängt die App und die Schnittstelle aktualisiert niemals die Aktivität, die Daten mit true anzeigt (dh die Verarbeitung erfolgt)

Zeige mich in die richtige Richtung. – Vielen Dank

2 Solutions collect form web for “Triggerereignis, wenn AsyncTask mit dem Listener fertig ist”

Klingt wie die dbProcesslistener Variable ist NULL . Rufen Sie Ihren Setter an und übergeben ihn ein initialisiertes Listener-Objekt einige Zeit, bevor Sie dbProcesslistener.ProcessingIsDone(true); aufrufen dbProcesslistener.ProcessingIsDone(true); ?

Habe die Antwort! Ich habe den Hörer nicht in meiner Berufsklasse initialisiert. Alles was ich tun musste, wurde in diese Zeile gesetzt

 db.setDbProcesslistener(this); 

Dh

 DatabaseRoutines db = new DatabaseRoutines(MyActivity.this); db.setDbProcesslistener(MyActivity.this); 

Und es hat angefangen zu arbeiten

Vielen Dank an alle, die einen Blick hatten und versuchten, an die Lösung zu denken 🙂

  • Aktivität und Fragment Interaktion
  • Behandle mehrere Schaltflächen-Klick-Listener
  • Kann ich einen OnClickListener-Button aus dem Hörer beziehen? (Android)
  • RecyclerView onclick listener feuert, bevor Klick-Animation abgeschlossen ist
  • Wie erstelle ich ein Fragment mit einem anderen Fragment mit dem Hörer im ersten Fragment
  • So erkennen Sie MediaPlayer-Ereignisse von youtube aus einem Dienst
  • Warum will Android onItemClick eine lange Zeile Id?
  • Android: zwei Spinner onItemSelected ()
  • Das Android ist ein Google Android Fan-Website, Alles über Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.