Aller au contenu

Changement d’orientation de l’écran durant une connexion à un serveur


Fractal

Recommended Posts

Bonjour,

Mon problème est le suivant :

J’ai une activité A avec un bouton. Quand l’utilisateur clique sur le bouton, un ProgressDialog apparaît et l’activité lance un service (bound service) qui se charge d’établir une connexion avec un serveur (dans un thread).

Lorsque la connexion est établie, le thread accède au ProgressDialog de l’activité et appelle la méthode dismiss() pour l’enlever.

Maintenant que se passe-t-il si l’orientation de l’écran change durant la connexion ?

L’activité est détruite, le service est « unBind » donc détruit automatiquement et la connexion en cours est perdue. J’aimerais évidemment que la connexion continue de s’établir comme si de rien n’était.

Comment faire ça simplement ?

Je pourrais sans doute démarrer le service au lieu de juste m’y lier, mais ça ne me semble pas être la bonne solution.

De plus, pour pouvoir accéder au ProgressDialog depuis le thread qui se connecte au réseau, je garde une référence à l’activité A dans le thread, et d’une part il paraît que c’est pas une bonne idée, et d’autre part cela ne pointera plus vers la bonne activité quand elle sera redémarrée.

Merci :)

Lien vers le commentaire
Partager sur d’autres sites

Tu as 2 solutions pour remédier à ce problème:

- gérer toi-même le changement d'orientation

- s'appuyer sur le mécanisme offert par Android pour permettre de garder le contexte en cas de changement d'orientation

Je te renvoie vers les sujets qui en parlent déja: ici et surtout ici

Lien vers le commentaire
Partager sur d’autres sites

Merci :)

Je ne pense pas que je vais gérer moi-même le changement d’orientation, vu qu’ils disent dans la doc que c’est n’à utiliser qu’en dernier ressort, mais onRetainNonConfigurationInstance() et getLastNonConfigurationInstance() semblent pouvoir faire ce que je veux.

Par contre, en ce qui concerne le service, est-ce que je dois quand même le « unBind() » dans la méthode onStop() de mon activité ?

Parce qu’il sera alors détruit automatiquement, alors que je veux qu’il reste là.

Lien vers le commentaire
Partager sur d’autres sites

Il ne faudra "unBinder" ton service dans onStop de ton Activity que si tu n'es pas passé par onRetainNonConfigurationInstance. Ce que je fais pour un cas comme celui-la, c'est garder une référence sur le service dans l'Activity. La méthode onRetainNonConfigurationInstance retourne en résultat cette référence, et la met à null dans l'Activity, ce qui fait que lors de l'exécution de onStop, je peux savoir s'il faut arreter le Service (référence non null, donc, on n'est pas passé par onRetain auparavant) ou non. Et dans le onCreate de l'Activity, avant de me "binder" au service, l'appel à getLastNonConfigurationInstance me permet de savoir s'il y a déjà un service actif, auquel cas j'utilise cette référence, plutôt que de me "binder" à un nouveau service

Lien vers le commentaire
Partager sur d’autres sites

Ça me paraît bizarre, la doc dit que onRetainNonConfigurationInstance() est appelée entre onStop() et onDestroy(), donc dans la méthode onStop() on ne peut pas a priori savoir si on est dans le cas d’un changement d’orientation ou pas.

Lien vers le commentaire
Partager sur d’autres sites

Oui mais si je veux le déconnecter dans onStop() ? :D

Bon, sinon je peux aussi forcer toutes les activités de l’appli à être en portrait, ce serait plus simple ^^ (et pendant le jeu c’est de toute façon forcément en portrait)

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...