2010-10-19 11 views
1

J'ai lu les autres fuites de messages de fenêtre et ont essayé ce que suggéré en vain.Android: fuites de fenêtre sur la finition

J'ai 3 activités: A, B et C. L'activité A rassemble des informations de l'utilisateur. L'activité B affiche un ProgressDialog tournant alors qu'il communique avec un serveur sur un autre thread. Lorsque le thread se termine, il supprime ProgressDialog et démarre l'activité suivante. L'activité C affiche les informations du serveur à l'utilisateur. L'activité B est configurée de manière à ce que lorsque l'utilisateur revient de C, il retourne à A.

Il est important que ces tâches soient dans des activités distinctes. À partir de maintenant, l'application fait ce qu'elle est supposée faire dans la plupart des cas, sauf dans le scénario suivant: Si l'utilisateur change d'orientation pendant l'activité C avant de retourner à l'activité A, l'application se bloque en raison d'une fuite de fenêtre .

  • Je rejette la ProgressDialog INTHE OnPause() de l'activité B avant istart C.
  • J'ai essayé de rejeter la ProgressDialog sur le thread principal à l'aide d'un gestionnaire, ainsi que dans le thread séparé.
  • Lorsque l'utilisateur ne modifie pas l'orientation en C, aucune fuite de fenêtre ne se produit.

Des idées? TIA

+1

Pouvez-vous fournir plus de détails sur l'accident?Quelle est la sortie de logcat exacte? – EboMike

+0

Je le ferais, sauf que j'ai résolu le problème. Donc, je ne peux pas donner le lire. J'aimerais pouvoir cependant parce que je ne sais toujours pas ce qui s'est mal passé. – mtmurdock

Répondre

0

Cela arrive souvent lorsque ProgressDialogs est utilisé. J'ai expérimenté avec ProgressDialog il ya quelques temps et j'ai trouvé que la chose à faire était de la renvoyer() de onPause() et de la créer à partir de onResume(). La tâche d'arrière-plan doit évidemment survivre à votre boîte de dialogue Activité &. J'ai donc utilisé onRetainNonConfigurationInstance() pour passer l'instance de tâche de l'activité détruite à la nouvelle. Une alternative, solution de contournement moins coûteuse pourrait être d'empêcher simplement votre activité d'être détruit et créé à nouveau simplement parce que l'orientation de l'écran a changé. Pour ce faire, en ajoutant Android: configChanges = "orientation" à la balise (s) dans votre AndroidManifest.xml.

+0

peut-être que vous n'avez pas lu la question ci-dessus. J'appelle déjà dismiss() dans onPause(), donc ce n'est pas le problème. Je ne voudrais pas recréer la boîte de dialogue dans onResume() car lorsque je retourne à l'activité B de l'activité C, je la ferme immédiatement en appelant finish() dans onActivityResult(). l'utilisateur ne devrait pas voir l'activité B à son retour de l'activité C. il devrait juste tomber à A. La fuite de fenêtre se produit lorsque l'application retourne à l'activité A. – mtmurdock

+0

Que pensez-vous qui se passe si l'écran est réorienté pendant l'activité B est en cours et avant que l'activité C soit montrée? –

+0

ce n'est pas ce que je demande. L'erreur se produit lorsque l'orientation est modifiée dans l'activité C. Lisez la question. – mtmurdock

0

J'ai résolu mon problème en changeant complètement la manière dont je m'occupais de tout. J'ai maintenant seulement deux activités (A et B) et affiche le ProgessDialog dans l'activité B tout en manipulant le savedInstanceState comme nécessaire pour contourner le problème.

Même si j'ai résolu le problème sur mon application, je ne sais toujours pas pourquoi cela se produisait auparavant et j'aimerais en savoir plus sur les fuites de fenêtres et pourquoi j'ai eu des problèmes. Si quelqu'un en sait plus sur le problème que j'ai eu, s'il vous plaît postez comme je suis sûr qu'il y en a d'autres avec le même problème.

Merci

0

Je ne sais pas si cela était lié à votre problème spécifique, mais j'avais une question similaire qui avait à faire avec des fenêtres qui fuient pour les dialogues qui sont créés dans la méthode onCreate d'une activité. Ainsi, si votre activité démarre en affichant une boîte de dialogue et que vous effectuez une modification de configuration, l'OS se souvient des boîtes de dialogue qui ont été affichées. Ainsi, lorsque l'activité est redémarrée, le système d'exploitation tente de restaurer votre ancienne boîte de dialogue. dialogue à nouveau (puisque c'est dans onCreate). J'ai trouvé en montrant seulement la boîte de dialogue pendant onCreate si ce n'est pas un changement de configuration (c'est-à-dire savedInstanceState! = Null), le problème de la fenêtre qui fuit est parti.