Question

Je commence à penser que pour obtenir un ProgressDialog pour travailler le AsyncTask doit être une classe interne au sein d'une classe d'activité. Vrai? [Edité beaucoup plus tard ... la réponse est fausse et je ne suis pas sûr que ce soit un bug ou quoi. J'utilise Android 1.5. Je vais lire sur les services.]

J'ai une activité l'utilisation d'une base de données pour manipuler des informations. Si la base de données est peuplé tout va bien. Si ce n'est pas rempli alors je dois télécharger des informations à partir d'un site Web, remplir la base de données, puis accédez à la base de données de population pour compléter les vues onCreate.

Le problème est sans quelques moyens pour déterminer quand le fil de AsyncTask a terminé peuplant la base de données, je reçois le texte suivant force Fermer message d'erreur: Désolé! L'application est arrêtée de façon inattendue. Je clique sur le bouton Fermer force, le fil de AsyncTask de fond continue de travailler, la base de données est renseigné, et tout fonctionne bien.

Je dois me débarrasser de ce message d'erreur et ont besoin 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 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 -----

Qu'est-ce que je fais mal?

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

activity.This est signalé comme une erreur: Aucune instance englobante de l'activité de type est accessible portée

Je pense que je dois FillDB étend l'activité puis créer une classe privée au sein FillDB extension AsyncTask? Ce travail de coutume. Aucune assurance lorsque l'activité FillDB démarre et ne peut pas utiliser startActivityForResult puisqu'aucun résultat est renvoyé de AsyncTask quand il est terminé.

Mise à jour: Essayé création d'une classe privée dans la classe d'appel. Encore ne peut pas montrer un ProgressDialog. L'une des erreurs est: Impossible de fenêtre ajouter - null jeton n'est pas pour une application. Je ne sais pas ce que jeton est fait référence.

Était-ce utile?

La solution 2

J'ai donné sur AsyncTask et utilisé un gestionnaire pour gérer le fil. Tout est bon.

Je ne sais pas si c'est un bogue dans 1.5 avec AsyncTask ou quelque chose d'autre que je ne l'ai pas.

Autres conseils

Avez-vous envisagé redéfinissant la méthode onCreateDialog () pour mettre en œuvre vos Dialogs? Il est facile de créer et de les contrôler de cette façon que Android fait la plupart du travail pour vous. J'ai un exemple ci-dessous faire exactement ce que vous essayez de faire.

http://pastie.org/880540

Je faisais le même problème que OP depuis un certain temps avec un public (externe) AsyncTask. Lors de la recherche sur le message d'erreur « a tenté de fenêtre ajouter avec jeton non-application », je trouve que le problème est dans la définition du contexte qui est passé dans le constructeur de la AsyncTask. Le contexte qui devrait être adoptée est « ce », pas this.getApplicationContext () ou this.getBaseContext (). Cela résolu mon problème.

Essayez de lancer

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

comme exécutable comme argument de Activity.runOnUiThread (). éléments de l'interface utilisateur doivent être créés et manipulés dans le thread d'interface utilisateur. Je suppose que cela est également vrai pour Dialogs.

[modifier] 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");
  }
};
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top