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

  • Aktivität und Fragment Interaktion
  • Behandle mehrere Schaltflächen-Klick-Listener
  • Android OnItemClickListener funktioniert nicht
  • Ist OnItemSelectedListener.onNothingSelected überhaupt angerufen?
  • OnCompletion Listener mit MediaPlayer
  • RecyclerView - Keine Animation auf NotifyItemInsert
  • Geste-Detektor funktioniert nicht
  • Wie Handle bearbeiten EditText Change Listener in Android
  • 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 🙂

    Das Android ist ein Google Android Fan-Website, Alles über Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.