ProgressDialog ne fonctionne pas en externe AsyncTask

Je commence à penser que, pour obtenir un ProgressDialog de travail de l'AsyncTask a un intérieur de classe à l'intérieur d'une classe d'Activité. Vrai? [Édité, beaucoup plus tard...la réponse est Fausse, et je ne suis pas sûr si c'est un bug ou quoi. Je suis sous Android 1.5. Je vais lire sur les Services.]

J'ai une activité utilise une base de données pour manipuler de l'information. Si la base de données est remplie tout est bien. Si elle n'est pas remplie alors j'ai besoin de télécharger des informations à partir d'un site web, remplir la base de données, puis d'accéder à la base de données de population pour compléter les points de Vue dans onCreate.

Problème est sans des moyens pour déterminer quand l'AsyncTask thread a fini de remplir la base de données, j'ai le Force Close message d'erreur: Désolé! L'application s'est arrêté de façon inattendue. Je clique sur la Force de bouton Fermer, l'arrière-plan AsyncTask thread continue à travailler, la base de données est renseignée, et tout fonctionne ok.

J'ai besoin de me débarrasser de ce message d'erreur et ont besoin d'un peu d'aide sur la façon de le faire. Voici quelques pseudo 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

Dans un fichier séparé:

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
    }
 }

Voici la trace de la pile à partir de l'émulateur:

----- 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 -----

Ce que je fais mal?

M. Flocon De Neige,

Essayé:

@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");
}
});
}

Activité.cela est signalé comme une erreur:
Pas de enfermant instance du type d'Activité est accessible dans le champ d'application

Je pense que je besoin de FillDB Activité s'étend ensuite créer une classe privée au sein de FillDB l'extension de AsyncTask? Qui a coutume de travail. Aucune assurance lorsque le FillDB de l'activité de départ et ne peut pas utiliser startActivityForResult depuis aucun résultat n'est retourné à partir de AsyncTask quand il est terminé.

Mise à jour: Essayé de créer une classe privée dans l'appel de la classe. Encore ne peut pas montrer une ProgressDialog. Un des messages d'erreur est: Impossible d'ajouter de la fenêtre -- jeton null n'est pas pour une application. Je n'ai aucune idée de ce jeton est mentionnée.

Utilisation adb logcat, DDMS, ou la perspective DDMS dans Eclipse pour regarder la Java trace de la pile associée à la force de fermer la boîte de dialogue, en tant que trace de la pile devrait vous donner plus d'informations sur ce qui ne va pas.
CommonsWare - je ne connais pas assez la bad pour trouver la trace de la pile /de data/anr/traces.txt. Mais en regardant le Logcat et DDMS dans Eclipse, il me semble que si j'ai un uncaught exception d'Exécution. java.lang.de réfléchir.InvocationTarget Exception java.lang.Runtime Exception WindowMai tenté d'ajouter de la fenêtre avec la non-application de jeton WindowToken (43711b88 jeton=null) l'Abandon. J'ai regardé pour voir si le contexte était nul et il ne semble pas être: ce.le contexte montre: contexte android.app.Application (id=830060323048)
Qu'est-ce que le Contexte vous êtes de passage à votre AsyncTask? Est-il de l'Activité ou de quelque chose d'autre?
Romain, je suis de passage le contexte de l'application: context = getcontexteapplication(); if(task == null || tâche.getStatus().equals(AsyncTask.Statut.FINI)) { task = new FillNYLottoDB(contexte); la tâche.execute(null); }
Ce qui se passe avec la boîte de dialogue, si vous changez entre paysage/portrait, mode, tandis que la tâche est en cours d'exécution? Est-il enregistrer pour créer la boîte de dialogue dans un Exécutable à l'aide de runOnUiThread(...)?

OriginalL'auteur eric | 2010-03-21