IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Rotation en détail (exemples à l'appui)


Sujet :

Android

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut Rotation en détail (exemples à l'appui)
    Bonjour,

    Je me penche sur la gestion de rotation de l'écran parce que mon application plante quand je change d'orientation pendant le chargement de données.

    Sur un écran fixe, aucun souci... normal je suppose...

    Bref, j'ai écumé le net à la recherche d'un tutoriel efficace mais le seul que je trouve est celui-ci: http://nbenbourahla.developpez.com/t...ation-android/

    Malheureusement, il ne m'est d'aucune utilité car il n'y a que quelques lignes de principes théoriques et c'est tout, aucun exemple concret...

    Bref, je ne sais absolument pas quoi/comment faire...

    Que veut-il dire par "sauver ses data dans un bundle" ? Où, quoi, quand, comment ?

    Quelqu'un aurait-il un bout de code/tutoriel plus explicite ?

    Merci d'avance pour votre aide.

  2. #2
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Heu... je crois qu'il y a un mélange entre rotation et gestion de l'activité...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     parce que mon appli crache quand je change d'orientation pendant le chargement de data!!
    C'est que tu ne gère pas le chargement correctement, et l'appli doit aussi cracher si tu lances une autre appli (ou que tu quittes simplement celle-ci) pendant le chargement... D'abord que dit le logcat ? Aucune information sur pourquoi elle crash ? hein ?

    Pour la rotation oui c'est très simple...

    Par défaut toutes les activités acceptent la rotation... ceci peut-être surchargé dans le manifest mais comme expliqué dans le tuto, c'est fortement déconseillé (à part cas évidents comme un jeu, etc...).

    Ensuite, dans l'activité, ou bien la rotation est gérée "manuellement" (on demande dans le manifest à être averti des screen rotation) et dans ce cas, il faut surcharger la fonction onScreenOrientationChange() ou un truc du genre, et y mettre le code qu'on veut... Le plus simple: recréer les views avec un setContentView(), ne pas oublier quand même de restaurer leur contenu si besoin...

    Ou on laisse le système s'en occuper... et dans ce cas, il fait dans le bourrin: destruction de l'activité, et recréation... donc on passe dans les phases onPause(), onDestroy(), ... et onCreate(), onResume() sur un autre objet. Mais il le fait (c'est bien expliqué dans la "vie d'une activité" chez google), comme si il libérait le système pour de la place mémoire (donc cette séquence n'est pas uniquement appelée par la rotation, elle peut l'être à tout moment)... Donc sauvegarde de l'état de la "vue" par appel à onSaveInstanceState()... puis passage de cette sauvegarde au onCreate() (le bundle 'savedInstanceState'). Du coup, le contenu des vues est inchangé.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    Ok, j'essaie de fournir une explication plus claire et je reviens développer tout ça

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    ok alors:

    1.) si je comprends bien on n'est pas obligé de gérer le changement d'orientation? le système se demmerde très bien tout seul..... tant qu'il n'y a pas de layout à changer, par exemple... ce qui est bien mon cas, même layout H & V (en tout cas pour le moment).

    2.) ce qui tombe bien parce que dans mon cas, ce ne seraient pas des data à sauvegarder, mais des thread d'initialisation........ et c'est là que je ne vois pas comment faire une copie de cet état
    -> j'ai juste un champ de saisie... dont je retrouve bien la valeur qq soit l'orientation
    -> pour le reste: boutons & spinners

    3.) log cat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Activity com.toto.test.Test has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@40f81f28 that was originally added here
    sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    chargement = ProgressDialog.show(this, "","Chargement en cours, veuillez patienter...", true);
    4.) l'appli ne plante effectivement que durant mes moments de chargements de tâches en fond

    DONC, ce ne serait que le ProgressDialog qui pose problème finalement?


    EDIT: ce qui veut dire qu'un "bête"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void onDestroy()			//en cas de destruction de l'activité (changement d'orientation) IL FAUT fermer la																
    	{								//progressBar si elle était active... sinon crash applicatif (Activity com.toto.test.Test has leaked window)
    		if (chargement.isShowing()) chargement.cancel();  
    		super.onDestroy();
    	}
    suffirait finalement?

  5. #5
    Expert confirmé
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Points : 4 166
    Points
    4 166
    Par défaut
    Dans ton cas, je pense qu'il faut overrider les méthodes onRetainNonConfigurationInstance ()/getLastNonConfigurationInstance() afin de pouvoir conserver l'état de l'objet qui s'occupe de charger les données (un AsynTask ou un Handler je suppose). De la lecture intéressante sur http://developer.android.com/guide/t...e-changes.html
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    Ok, je suppose que tu fais référence au paragraphe "Retaining an Object During a Configuration Change"... qui dans mon cas, éviterait de relancer les threads d'init à chaque changement d'orientation.

    Bonne idée oui, appli plus fluide!

    Par contre, même à partir de l'exemple donné,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @Override
    public Object onRetainNonConfigurationInstance() {
        final MyDataObject data = collectMyLoadedData();
        return data;
    }
    je ne vois pas du tout comment faire un "backup" de mes threads/async pour qu'ils se poursuivent dans la nouvelle activité, sans repartir de zéro...
    -> conceptuellement, je ne vois pas quel "objet" je suis censé manipuler
    -> ni surtout comment

    Par ailleurs, comme parmi mes init il y a 2 spinner de sélection à remplir, est ce que c'est toujours possible puisque la doc elle même précise que ce n'est pas faisable (memory leak) pour des adapter (setadapter des spinner) ou tout autre objet en rapport avec un context?

  7. #7
    Expert confirmé
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Points : 4 166
    Points
    4 166
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    private final AsyncTask<Void,Void,Void> loader; //AsyncTask qui charge les données
     
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
     
        loader = (AsyncTask<Void,Void,Void>) getLastNonConfigurationInstance();
        if (loader == null) {
            loader = AsyncTask<Void,Void,Void>();
        }
    }
     
    @Override
    public Object onRetainNonConfigurationInstance() {
        return loader;
    }
    En fait, je pense qu'il faut être plus complet que cela et gérer les 2 situations :
    - Soit l'orientation a eu lieu pendant le chargement des données par un thread : il faut conserver (retain) l'objet de threading (comme le montre mon exemple avec un AsyncTask)
    - Soit l'orientation a eu lieu après le chargement des données, c-a-d une fois les données affichées à l'écran : il faut conserver (retain) l'objet collection des données ou même carrément l'objet Adapter

    Donc, dans l'idée, ça donnerait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    private final AsyncTask<Void,Void,Void> loader; //AsyncTask qui charge les données
    private final ArrayListAdapter<String> adapter;  //Adapter pour les données
    private boolean loadingDone = false;
     
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
     
        Object o = getLastNonConfigurationInstance();
     
         if (o == null) { //Cas où il n'y a pas eu de destruction puis recréation de l'activité
            loader = new MyAsyncTask<Void,Void,Void>(); //dans le onPostExecute() de l'asyncTask, il faut faire passer le champs loadingDone à true !
            adapter = new ArrayListAdapter<String>(...);
         } else {  //Cas où il y a destruction suite à un changement d'orientation
               if (o instanceOf MyAsyncTask<Void,Void,Void>) {
                      loader = (MyAsyncTask<Void,Void,Void>) o;
               } else if (o instanceOf ArrayListAdapter<String>) {
                      adapter = (ArrayListAdapter<String>) o;
               }
         }
    }
     
    @Override
    public Object onRetainNonConfigurationInstance() {
        if(loadingDone) { return adapter; } else { return loader; }  //Conservation en fonction de la situation
    }
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  8. #8
    Expert confirmé
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Points : 4 166
    Points
    4 166
    Par défaut
    En consultant la doc http://developer.android.com/guide/c...d-threads.html, je vois que dans la section AsyncTask ils évoquent ce problème de changement d'orientation, et conseilles de regarder comment cela a été géré dans l'application Shelves

    Tiens nous au courant de tes découvertes.
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  9. #9
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    Ok, ça risque de me prendre un moment, mais pas de soucis pour le retour d'info!

    Au pire, je laisse ma V1 en l'état, avec le cancel de ma PB dans le onDestroy si nécessaire... au moins plus de crash suite à un leak, même si pas optimal.

    Et puis je planche sur l'optimisation pour une V1.1.

  10. #10
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Bonjour,

    Un tutoriel sur le sujet
    http://mathias-seguy.developpez.com/...async_memleak/
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  11. #11
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    Merci, je vais voir ça aussi.

    C'est pour ça qu'on aime développez par rapport à d'autres forums:
    -> la compétence réelle!


  12. #12
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    Bon, redéfinition de priorités oblige, je dois laisser ça de coté pour le moment.
    J'y reviendrai dès que possible.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Exemple d'application Relation Maitre-détail avec Dbexpress
    Par Peter K. dans le forum Bases de données
    Réponses: 0
    Dernier message: 13/11/2007, 11h33
  2. avez-vous une solution Action script (exemple à l'appuie)
    Par lokis dans le forum ActionScript 1 & ActionScript 2
    Réponses: 4
    Dernier message: 12/01/2007, 16h42
  3. algo : rotation d'objet 3d
    Par numeror dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 19/08/2002, 22h58
  4. recherche exemple simple pour corba en c++
    Par Pinggui dans le forum CORBA
    Réponses: 4
    Dernier message: 06/05/2002, 11h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo