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 :

Eviter le plantage à la rotation de l'écran


Sujet :

Android

  1. #1
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut Eviter le plantage à la rotation de l'écran
    Bonjour,

    Je lance un thread dont l'exécution peut durer 30 secondes, dans lequel j'appelle au début un progressDialog.

    Lorsque je tourne l'écran, tout se réinitialise je crois, et j'ai plante à cause du progressDialog qui est déjà affiché.

    J'ai mis un AtomicBoolean à true au démarrage du thread, et false au OnStop(), mais je ne vois pas quoi faire pour la rotation... J'ai lu ce tuto, mais je bute.

    Quelqu'un pourrait-il m'expliquer que faire dans le onPause, onRetainNonConfigurationInstance, onSaveInstanceState... etc

    Merci

  2. #2
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 43
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    J'avais écrit un petit article qui présente ce problème. Si tu es bien dans le même cas regarde à la fin de l'article, je redirige vers un autre article bien plus complet qui propose plusieurs solutions.

    http://blogdebenoit.wordpress.com/20...rogressdialog/

    En espérant que ça puisse t'aider.

  3. #3
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Merci, c'est vrai que c'est exactement mon problème, mais c'est assez compliqué à mettre en oeuvre...

    En simplifiant, peut être à l'extrême, j'ai fait ç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
    private AtomicBoolean boolLocThread = new AtomicBoolean(false);
     
    OnCreate() {
       if (!boolLocThread.get()) {
          boolLocThread.set(true);
          myThread.start();
       }
    }
     
    protected void onSaveInstanceState(Bundle outState) {
       outState.putBoolean("boolLocThread", boolLocThread.get());
       super.onSaveInstanceState(outState);
    }
     
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
       boolLocThread.set(savedInstanceState.getBoolean("boolLocThread"));
       super.onRestoreInstanceState(savedInstanceState);
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    savedInstanceState.getBoolean("boolLocThread")
    me renvoie bien true dans le onRestore(), mais mon thread est reexécuté quand même (si je regarde cette valeur dans le OnCreate(), elle est à false...)

  4. #4
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Ok, c'est parce que onRestore est lancé après onCreate. Il ne me reste plus qu'à tout réordonner du coup?

  5. #5
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 43
    Points : 53
    Points
    53
    Par défaut
    Ton code du onCreate irait plutôt dans le onResume non ?

    Il y a aussi un petit cas à prendre en compte, celui ou ton Thread se finit alors que ton activité n'existe pas, si tu reçoit un appel téléphonique durant l'exécution du thread.

  6. #6
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Oui, je pensais aussi mettre le onCreate dans le onResume.

    Par contre voila le problème:
    - Je lance ma progressDialog dans le onResume()
    - Je tourne, donc onSave() s'execute.
    - onRestore() s'exécute.

    J'aimerais entre 2) et 3) récupérer l'instance du progressDialog, mais je ne sais pas comment faire. J'ai pensé à le supprimer, puis le recréer, mais comme onSave() est executé après onResume() au début, il n'apparait pas du tout (car immédiatement supprimé après avoir été créé).

    Comment transmettre son "identifiant"?

  7. #7
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    J'ai trouvé ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AppClass app=(AppClass) getApplication();
    app.Dialog=new WeakReference<ProgressDialog>(ProgressDialog.show(this, "", str, true));
    Mais Dialog et AppClass sont inconnus chez moi, qu'est ce que c'est?

    Merci

  8. #8
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 43
    Points : 53
    Points
    53
    Par défaut
    Pour ta ProgressDialog je crois que les 2 seules solutions sont
    - soit d'utiliser la méthode showDialog de ton activité pour qu'Android s'occupe de la rattacher automatiquement à la nouvelle activité
    - soit de fermer et recréer toi même une nouvelle boîte de dialogue dans la nouvelle activité

    "AppClass" doit être une class héritant de Application. Cela dépend de ta propre implémentation de la class Application.

  9. #9
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Merci pour le soutien! Après toutes ces heures j'ai finalement obtenu un truc sans erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void onPause() {
       if (progressDialog != null) {
          Log.i("APP", "Suppression du progressDialog (ROTATE)");
          progressDialog.dismiss();
       }
       super.onPause();
    }
    Et dans le OnCreate():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (savedInstanceState != null) {
       boolLocThread.set(savedInstanceState.getBoolean("boolLocThread"));
       if (boolLocThread.get()) {
          Log.i("APP", "Ré-affichage du progressDialog");
          progressDialog = ProgressDialog.show(app.this, "Titre", "Message", true);       		
       }
    }
    Et là aucun soucis, il est bien supprimé et recréé... mais, il n'est pas resupprimé à savoir lors de (dans le Handler):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Log.i("APP", "Suppression définitive du progressDialog (LOC)");
    progressDialog.dismiss();
    boolLocThread.set(false);
    Mon log s'affiche bien, aucune erreur non plus, mais le dialog est toujours là...
    D'où ça peut provenir? Edit: à mon avis, l'activité étant recréée, le handler contenant ma suppression définitive aussi, donc mon ancien thread ne trouve pas le bon progressDialog, ou qqch comme ça? Mais c'est bizarre qu'il n'y ait pas d'erreur non? J'ai vérifié, et après rotation, isShowing() est à false

    Merci

  10. #10
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    WOUHOUUU si je déclare:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private static ProgressDialog progressDialog = null;
    au lieu de:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private ProgressDialog progressDialog = null;
    ça roule comme sur des roulettes!!

    OUF! Merci (délivrance j'ai jamais été aussi heureux de cliquer sur Résolu!)

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

Discussions similaires

  1. Tabactivity et rotation de l'écran
    Par cadoudal56 dans le forum Android
    Réponses: 1
    Dernier message: 24/02/2012, 00h54
  2. écran tactile et rotation de l'écran
    Par troumad dans le forum Linux
    Réponses: 0
    Dernier message: 02/07/2011, 09h46
  3. Rotation de l'écran
    Par mulfycrowh dans le forum C++
    Réponses: 4
    Dernier message: 04/03/2010, 22h34
  4. [C#][PocketPC] Evenement : rotation de l'écran
    Par romain69005 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 22/02/2006, 11h46
  5. [TP] Lecture de nombres : comment éviter les plantages ?
    Par le-an dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 20/11/2005, 14h54

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