2010-08-11 4 views
2

Je suis dans une situation très étrange lorsque j'utilise la méthode PackageManager.getInstalledPackages(). La première fois que je lance mon activité, je reçois une liste valide de tous les paquets installés. Mais la deuxième fois que je lance mon activité, je reçois une liste vide ... Qu'est-ce qui pourrait causer ça? J'utilise ce code pour obtenir la liste: Liste pkgList = getPackageManager(). GetInstalledPackages (PackageManager.GET_ACTIVITIES);PackageManager.getInstalledPackages() retourne la liste vide

Je construis contre le 1.6 SDK pour la compatibilité avec 1.5+

Merci d'avance pour vos suggestions/aide ... Je suis vraiment déconcerté quant à la cause et ne peut pas penser à ce que je suis mal faire.

+0

Ok .... cela semble être un problème avec l'utilisation de AsyncTask. Quand je retire mon code d'AsyncTask alors PackageManager.getInstalledPackages() renvoie correctement la liste des paquets à chaque fois ... Donc, des idées sur pourquoi cet appel ne fonctionne pas avec AsyncTask? – Justin

Répondre

2

Peut-être que le PackageManager doit être appelé sur le thread d'application principal, pour une raison quelconque. Je n'ai pas essayé de l'utiliser d'un AsyncTask.

+0

C'est la seule chose à laquelle je pouvais penser ... Si c'est le cas, cela devrait probablement être documenté. J'ai au moins une solution de contournement, même si mon initialisation prend un peu plus de temps que je le voudrais car je dois obtenir la liste des applications installées sur le thread principal. – Justin

+0

@Justin: Je ne m'attendrais pas à ce que 'getInstalledPackages()' soit très long, mais peut-être le fera-t-il. Vous pouvez le faire dans 'onPreExecute()' de votre 'AsyncTask' et le reste de l'initialisation dans' doInBackground() '. En ce qui concerne les docs, je suis d'accord - si vous pouvez créer un exemple de projet démontrant le problème, postez un problème sur http://b.android.com avec l'exemple et demandez une mise à jour de la documentation ou un correctif (au cas où * devrait * travailler sur un fil de fond). – CommonsWare

+0

J'ai oublié la méthode onPreExecute(). Je vais essayer d'utiliser cela et voir quel comportement je reçois. Après votre commentaire sur le getInstalledPackages, je pense que vous avez raison ... le ralentissement doit être ailleurs. Je vais voir ce que je peux faire pour obtenir un exemple de projet ensemble. Merci pour l'aide. – Justin

1

Vous récupérez une liste vide, car le PackageManager est mort, car le tampon IPC utilisé pour renvoyer la liste des applications installées a dépassé la taille de la mémoire tampon de 1 Mo (à partir de la version 4.4). Depuis l'API 15, le même comportement produirait un TransactionTooLargeException. Sur < 15 API seulement une liste vide est renvoyée si et parfois une petite erreur est visible dans les logcats.

getInstalledPackages() n'a pas besoin d'être exécuté sur le thread UI. Cela peut sembler comme ça, mais cela ne serait qu'accidentel. Si vous ne l'exécutez que sur le thread principal, vous avez l'effet de bord qui empêche les appels simultanés qui pourraient remplir le tampon IPC partagé à l'échelle du processus.

Questions connexes