ProgressDialog ne fonctionne pas dans AsyncTask externe
-
21-09-2019 - |
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.
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.
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 Dialog
s.
[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");
}
};