2012-12-19 3 views
1

Voici le scénario:retour Android AsyncTask rejetant un ProgressDialog après la rotation de l'écran

  • page de connexion de compte
  • En cliquant sur "Sign-in" déclenche une connexion AsyncTask
  • Pour bloquer l'interface utilisateur lors de l'accès au réseau, un ProgressDialog apparaît
  • à son retour, le ProgressDialog est rejeté et l'utilisateur transmis sur

Th Ce flux fonctionne très bien.

Voici le problème:

  • L'utilisateur peut faire pivoter l'écran alors que le AsyncTask est l'exploitation forestière/elle dans

Actuellement, le ProgressDialog est référencé par un champ de classe, et Rejeté à l'aide que pointeur et appel à .dismiss().

Si l'écran est pivoté, cependant, tout se bloque.

Probablement parce que l'activité est recréée? Mon soupçon est que la fermeture autour de cette référence de champ pointe vers un objet inaccessible. Quelle est ta prise?

Comment puis-je le résoudre de manière fiable et élégante? Il suffit d'ajouter if (... != null) chèques?

Plus généralement, je dois avouer que je ne comprends pas la « meilleure pratique » à appliquer dans les cas comme celui-ci:

  • Activité A déclenche une AsyncTask
  • L'utilisateur quitte l'activité A (bouton de retour? rotation de l'écran? onCliquez sur ce qui démarre Intention?)
  • L'AsyncTask est de retour lorsque l'activité A n'est plus la plus haute et son onPostExecute() a un effet d'interface utilisateur, notez que l'observateur délégué original n'est plus disponible .

  • confused (note: Je suis un débutant, donc une explication approfondie me aiderait beaucoup)

Répondre

1

Oui à changer l'orientation, l'activité est détruite puis recréée à nouveau.
Lorsqu'une modification de configuration se produit au moment de l'exécution, l'activité est arrêtée et redémarrée par défaut, mais la déclaration d'une configuration avec cet attribut empêchera le redémarrage de l'activité. Au lieu de cela, l'activité reste en cours d'exécution et sa méthode onConfigurationChanged() est appelée.
Ajoutez cette ligne android:configChanges="orientation|keyboardHidden" à votre fichier manifeste

<activity 
    android:name="" 
    android:label="" 
    android:configChanges="orientation|keyboardHidden" /> 
+0

S'il vous plaît expliquer comment cela aide dans mon cas. – Robottinosino

+0

Cela peut fonctionner, mais le raisonnement est faux. 'android: configChanges' spécifie les changements de configuration que' Activity' va gérer lui-même avec 'onConfigurationChanged(). Voir [docs android] (http://developer.android.com/guide/topics/manifest/activity-element.html), y compris cette note - "Note: L'utilisation de cet attribut doit être évitée et utilisée uniquement comme un Pour plus d'informations sur la façon de gérer correctement un redémarrage en raison d'un changement de configuration, veuillez lire la section «Gestion des modifications d'exécution». – iagreen

+0

@iagreen, merci pour la correction. Je vais essayer de modifier le raisonnement en fonction de vos informations. merci –

0

Je recommande regarder Handling Runtime Changes. Pour une explication détaillée des détails des méthodes à votre disposition.

android:configChanges="orientation..." tells android your application will take care of resizing the current view hierarchy. As such, when you specify that in your manifest, your activity will not be destroyed and recreated, instead the system will just call your activity's `onConfigurationChanged()` method. As it so happens, most of the stock widgets will resize themselves when their container changes, so if you are using basic layouts, this usually "just works" by redrawing the view hierarchy in the new format. For custom widgets, this trick may not work. 

La méthode approuvée consiste à enregistrer des informations d'instance de configuration lorsque vous êtes détruit dans la méthode onSaveInstanceState(), puis recréer votre état dans onCreate()

Dans votre cas, la boîte de dialogue est rejetée lorsque puis écran change Vous pouvez soit laisser cette option, soit la rouvrir dans votre onCreate().

+0

Fin. Savez-vous comment gérer le rappel de la tâche asynchrone lorsque "quelque chose d'autre" déplace le focus de l'activité que '.execute()' d la tâche asynchrone en premier lieu? Certes, une question plus générale que dans le titre. – Robottinosino

Questions connexes