2010-02-15 10 views
0

J'ai un widget sur le marché Android appelé widget DigiClock, et après la dernière mise à jour j'ai eu des problèmes extrêmement rares et aléatoires sur Motorola Droids enracinée (il peut y avoir d'autres combinés avec le problème, mais les seules réponses que j'ai eu sont des utilisateurs droïdes enracinés). Le problème se produit lorsqu'une activité est exécutée qui exécute une asyncTask qui récupère toutes les applications installées à partir du périphérique tout en affichant un ProgressDialog (style horizontal). Le fichier de code Java applicable est disponible ici:Problème avec AsyncTask sur Droid enracinée

http://code.google.com/p/android-digiclockwidget/source/browse/trunk/src/com/davidgoemans/simpleClockWidget/LauncherChooser.java

Si vous souhaitez diff les modifications apportées entre un travail et la version non-travail, que l'on retrouve ici:

http://code.google.com/p/android-digiclockwidget/source/diff?spec=svn10&old=7&r=9&format=side&path=/trunk/src/com/davidgoemans/simpleClockWidget/LauncherChooser.java

Ce qui semble se produire sur le droïde est: * La boîte de progression apparaît * La boîte de progression se ferme avant qu'elle ne soit terminée * La liste vide apparaît

Il semble que l'AsyncTask qui récupère les applications soit détruit. Est-ce possible?

Merci, David

EDIT:

trouvé le problème, se avère que dans Android 2.0 (pas 2.1 ou 1.6)

Liste des paquets = getPackageManager() de getInstalledPackages (PackageManager. .GET_ACTIVITIES);

accidents dans ma situation, mais

Liste des paquets = getPackageManager() getInstalledPackages (0).

ne fait pas.

+0

Vous n'avez pas de journal pour le moment où l'asynctask est tué? – pgsandstrom

+0

Je n'ai pas accès à un périphérique où il se passe, donc, fondamentalement, je vais sur la parole de mes utilisateurs. – DavidG

Répondre

1

Trouvé le problème, s'avère que dans Android 2.0 (PAS 2.1 ou 1.6)

List packages = getPackageManager().getInstalledPackages(PackageManager.GET_ACTIVITIES); 

accidents dans ma situation, mais

List packages = getPackageManager().getInstalledPackages(0); 

ne fonctionne pas. J'ai trouvé cela en testant dans l'émulateur 2.0. Cela ajoute à la peine d'avoir à tester mon application maintenant sur 1.5, 1.6, 2.0 et 2.1 au lieu de seulement les cas marginaux:/

2

Je ne suis pas certain que ce soit la cause des symptômes, mais je peux voir quelques problèmes avec le code:

  • Vous ne devez pas manipuler des objets de l'interface utilisateur comme votre ProgressDialog de tout fil, sauf pour le principal thread d'interface utilisateur , car les objets de l'interface utilisateur ne sont pas thread-safe. Au lieu d'appeler progressDialog.setProgress(), appelez AsyncTask.publishProgress(), puis redéfinissez AsyncTask.onProgressUpdate().

http://developer.android.com/resources/articles/painless-threading.html

  • En outre, votre code n'empêche pas les deux threads d'accéder à "menuEntries" en même temps. Le moyen le plus simple de réparer cette partie serait de déplacer l'appel à setListAdapter() de onCreate() et de onPostExecute().
+0

ouah, merci. Je n'avais pas réalisé que ProgressDialog était également affecté. Je vais l'essayer ce soir et voir si ça marche. – DavidG

+0

merci, mais j'ai trouvé le problème (voir ci-dessus) – DavidG