Frage

Ich fange an zu denken, dass der Asynctask eine innere Klasse innerhalb einer Aktivitätsklasse sein muss, um einen Fortschritt zu erhalten. WAHR? [Viel später bearbeitet ... die Antwort ist falsch und ich bin mir nicht sicher, ob dies ein Fehler oder was ist. Ich benutze Android 1.5. Ich werde mich über Dienste informieren.

Ich habe eine Aktivität, die eine Datenbank verwendet, um Informationen zu manipulieren. Wenn die Datenbank besiedelt ist, ist alles in Ordnung. Wenn es nicht besiedelt ist, muss ich Informationen von einer Website herunterladen, die Datenbank bevölkern und dann auf die besiedelte Datenbank zugreifen, um die Ansichten in OnCreate zu vervollständigen.

Das Problem ist ohne Mittel, um festzustellen, wann der Asynctask -Thread die Datenbank beendet hat. Ich erhalte die folgende Kraftschließungsmeldung: Entschuldigung! Die Anwendung hat unerwartet gestoppt. Ich klicke auf die Schaltfläche "Force Close", der asynctaskische Hintergrund funktioniert weiterhin, die Datenbank wird besiedelt und alles funktioniert in Ordnung.

Ich muss diese Fehlermeldung loswerden und benötigen Hilfe dazu. Hier ist ein PSUEDO -Code:

public class ViewStuff extends Activity
{
  onCreate
  { 
    if(database is populated)
      do_stuff
    else
    {
      FillDB task = null;
      if(task == null || task.getStatus().equals(AsyncTask.Status.FINISHED))
       {                
         task = new FillDB(context);
         task.execute(null);
       }
    }

  continue with onCreate using information from database to properly display 

 } // end onCreate
} // end class

In einer separaten Datei:

public class FillDB extends AsyncTask<Void, Void, Void>
{
    private Context context;

    public FillDB (Context c)  //pass the context in the constructor
{
    context = c;
}

    public void filldb ()
    {
      doInBackground();
    }

    @Override
    protected void onPreExecute()
    {          
       ProgressDialog progressDialog = new ProgressDialog(context);
       //crashes with the following line
       progressDialog.show(context, "Working..", "Retrieving info");
    }

    @Override
    protected Void doInBackground(Void... params)
    {
  // TODO Auto-generated method stub

try
     etc etc etc
    }
 }

Hier ist die Stapelspur aus dem Emulator:

----- pid 846 at 2010-03-21 19:58:25 -----
Cmd line: com.trial

DALVIK THREADS:
"main" prio=5 tid=3 NATIVE
 | group="main" sCount=1 dsCount=0 s=0 obj=0x40018e70
 | sysTid=846 nice=0 sched=0/0 handle=-1098855268
 at android.os.BinderProxy.transact(Native Method)
 at      android.app.ActivityManagerProxy.handleApplicationError(ActivityManagerNative.java:2103)
 at com.android.internal.os.RuntimeInit.crash(RuntimeInit.java:302)
 at   com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:75)
 at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:887)
 at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:884)
 at dalvik.system.NativeStart.main(Native Method)

 "Binder Thread #3" prio=5 tid=15 NATIVE
 | group="main" sCount=1 dsCount=0 s=0 obj=0x43733d88
 | sysTid=852 nice=0 sched=0/0 handle=1486928
 at dalvik.system.NativeStart.run(Native Method)

"Binder Thread #2" prio=5 tid=13 NATIVE
 | group="main" sCount=1 dsCount=0 s=0 obj=0x437313c8
 | sysTid=851 nice=0 sched=0/0 handle=1492472
 at dalvik.system.NativeStart.run(Native Method)

"Binder Thread #1" prio=5 tid=11 NATIVE
 | group="main" sCount=1 dsCount=0 s=0 obj=0x4372b9b0
 | sysTid=850 nice=0 sched=0/0 handle=1492664
 at dalvik.system.NativeStart.run(Native Method)

"JDWP" daemon prio=5 tid=9 VMWAIT
 | group="system" sCount=1 dsCount=0 s=0 obj=0x4372a2a0
 | sysTid=849 nice=0 sched=0/0 handle=1490176
 at dalvik.system.NativeStart.run(Native Method)

"Signal Catcher" daemon prio=5 tid=7 RUNNABLE
| group="system" sCount=0 dsCount=0 s=0 obj=0x4372a1e8
| sysTid=848 nice=0 sched=0/0 handle=1487888
 at dalvik.system.NativeStart.run(Native Method)

"HeapWorker" daemon prio=5 tid=5 VMWAIT
 | group="system" sCount=1 dsCount=0 s=0 obj=0x427d03c0
 | sysTid=847 nice=0 sched=0/0 handle=1487592
 at dalvik.system.NativeStart.run(Native Method)

 ----- end 846 -----

Was mache ich falsch?

Mr. Snowflake,

Versucht:

@Override
protected void onPreExecute()
{

Activity.this.runOnUiThread(new Runnable() {
      public void run() {
        ProgressDialog progressDialog = new ProgressDialog(context);
        //crashes with the following line
        progressDialog.show(context, "Working..", "Retrieving info");
      }
    });
}

Aktivität. Dies wird als Fehler gekennzeichnet: Keine eingeschlossene Instanz der Typaktivität ist im Bereich zugänglich

Ich denke, ich muss fillDB die Aktivität erweitern und dann eine private Klasse innerhalb von FILDB -Erweiterung von Asynctask erstellen? Das funktioniert nicht. Keine Zusicherung, wenn die FILDB -Aktivität beginnt und keine StartActivityForresult verwenden kann, da bei der Fertigstellung kein Ergebnis von Asynctask zurückgegeben wird.

UPDATE: Versucht, eine private Klasse in der Anrufklasse zu erstellen. Ich kann immer noch keinen FortschrittsDialog zeigen. Einer der Fehler ist: Fenster hinzufügen - Token Null ist nicht für eine Anwendung. Ich habe keine Ahnung, worauf Token verwiesen wird.

War es hilfreich?

Lösung 2

Ich gab Asynctask auf und benutzte einen Handler, um den Faden zu behandeln. Alles ist gut.

Ich bin mir nicht sicher, ob es ein Fehler in 1.5 mit Asynctask oder etwas anderem ist, das ich nicht getan habe.

Andere Tipps

Haben Sie darüber nachgedacht, die Methode auf Createdialog () zur Implementierung Ihrer Dialoge zu überschreiben? Es ist einfach, sie auf diese Weise zu erstellen und zu steuern, da Android den größten Teil der Arbeit für Sie erledigt. Ich habe unten ein Beispiel, das genau das tut, was Sie versuchen.

http://pastie.org/880540

Ich hatte seit einiger Zeit das gleiche Problem wie OP mit einem öffentlichen (externen) Asynctask. Bei der Erforschung der Fehlermeldung "versucht, mit Nichtantrags-Token ein Fenster hinzuzufügen", stellte ich fest, dass das Problem darin besteht, den Kontext festzulegen, der im Konstruktor der Asynctask übergeben wird. Der Kontext, der übergeben werden sollte, lautet "this", nicht this.getApplicationContext () oder this.getBaseContext (). Das hat mein Problem gelöst.

Versuchen Sie zu rennen

   ProgressDialog progressDialog = new ProgressDialog(context);
   //crashes with the following line
   progressDialog.show(context, "Working..", "Retrieving info");

als Runnable als Argument für Aktivität.Runonuithread (). Benutzeroberflächenelemente sollten im UI -Thread erstellt und manipuliert werden. Ich denke, das gilt auch für Dialogs.

Bearbeiten] Code:

Activity.this.runOnUiThread(new Runnable() {
  public void run() {
    ProgressDialog progressDialog = new ProgressDialog(context);
    //crashes with the following line
    progressDialog.show(context, "Working..", "Retrieving info");
  }
};
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top