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 :

AlertDialog & erreur "Activity has leaked window"


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 AlertDialog & erreur "Activity has leaked window"
    Hello!

    Je ne comprends pas qq chose à propos de cette erreur!

    Selon les infos que j'ai pu trouver sur différents site, cela arrive qd on essaye d'afficher qq chose:

    -> dans une activity fermée

    -> sur une progress bar en cours

    Mais dans mon cas, c'est pas ç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
     
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
     
    try 
        {
            if (initUniqID() == -1)
            {           
                AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
                alertDialogBuilder.setMessage(msgNetwork).setCancelable(false).setPositiveButton("OK", new DialogInterface.OnClickListener(){public void onClick(DialogInterface dialog, int id){finish();}});
                AlertDialog alert = alertDialogBuilder.create();
                alert.show();   
            }
     
     
            if (setConfig() == -1)
            {
                AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
                alertDialogBuilder.setMessage("(setConfig) " + msgFailure).setCancelable(false).setPositiveButton("OK", new DialogInterface.OnClickListener(){public void onClick(DialogInterface dialog, int id){finish();}});
                AlertDialog alert = alertDialogBuilder.create();
                alert.show();
            }
        }
        catch (.......)
    LOGCAT
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    11-09 15:04:20.510: E/WindowManager(29199): Activity com.test.Test2 has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@40fa0238 that was originally added here
     
    11-09 15:04:20.510: E/WindowManager(29199): at com.test.Test2.onCreate(Test2.java:151)
    SYMPTOMES:
    Quand ej coupe le réseau, les 2 fcts doivent retourner -1 pour signaler une erreur, ok.

    Pour chaque retour, je veux informer l'utilisateur du soucis & terminer l'appli, ok.

    Le problème c'est qu'individuellement (en commentarisant l'autre) initUniqID() seule & setConfig() seule fonctionnent bien, mais les 2 ensembles, non!

    Je ne comprends donc pas pourquoi j'ai ce message d'erreur sur le alert.show() de initUniqID() (logcat) quand les 2 fcts sont actives ds mon source.

    -> iniUniqID() toute seule: son message d'alerte s'affiche bien

    -> setConfig() toute seule: son message d'alerte s'affiche bien

    -> les 2 ensembles: SEUL le MSG de setConfig() (le 2èmle donc, et pas le 1er!) s'affiche alors que iniUniqID() génère l'erreur du logcat!

    Pourquoi le MSG de iniUniqID() ne s'affiche pas?

    Une idée?
    Puisqu'à ce stade là, je n'ai pas quitté mon activité et que je n'ai pas non plus de progress bar en cours...

    Merci.

  2. #2
    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
    Et c'est TOUJOURS le 1er test qui pose problème avec le leak, si on inverse l'ordre des 2 fcts par exemple.

  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
    On avance petit à petit:
    -> restons sur l'hypothèse initiale: d'abord initUniqID() et ensuite setConfig()
    -> code posté ci-dessus

    SI j'enlève le finish() du Onclick() de setConfig()
    ALORS
    => le message de setConfig() s'affiche
    => je valide OK, aucune action puisque j'ai viré le finish(), normal
    => et là apparait en dessous le message de initUniqID()(?????)

    Ce qui veut donc dire qu'il:
    -> affiche le MSG initUniqID() mais n'attend pas la réponse
    -> et réaffiche tout de suite, par dessus, le MSG setConfig()

    D'où l'erreur de leak puisque l'activité est fermée par le finish de setConfig() alors que le MSG de initUniqID() est toujours ouvert!

    DONC:
    1.) pourquoi n'attend-il pas la validation du 1er MSG avant d'afficher le 2ème???
    2.) et donc surtout comment remédier au problème?

    Je suppose que ça pourra intéresser d'autre débutants comme moi, parce que j'ai qd même mis 2 jours de tests en tout genre pour arriver à trouver ça!

    Merci.

  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
    Aurais-je posé une colle aux spécialistes?

  5. #5
    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
    Ce n'est pas une colle... tu essayes d'afficher deux boites de dialogue en même temps... affiche les juste l'une après l'autre...

    Comme tu perds l'objet "alert" tu n'as plus aucun moyen de faire un "dismiss" dessus => leaké...
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  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
    Non je ne les affiche pas en même temps (voir code), mais bien l'une après l'autre (si les 2 cdts sont remplies).

    Je ne capte pas là...

    -> j'affiche bien d'abord MSG1
    -> mais MSG2 couvre MSG1, sans attendre la validation de ce dernier

  7. #7
    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
    Citation Envoyé par steph68b Voir le message
    Non je ne les affiche pas en même temps (voir code), mais bien l'une après l'autre (si les 2 cdts sont remplies).
    Ben non "show()" il attend rien, il affiche juste.

    -> j'affiche bien d'abord MSG1
    Oui
    -> mais MSG2 couvre MSG1, sans attendre la validation de ce dernier
    Quelle attente ? Il n'y a nulle part d'attente de validation.
    Ou il y a attente de validation et dans ce cas l'application va crasher pour ANR (revient jamais du onCreate), ou pas (ce qui est le cas) et du coup MSG2 écrase MSG1....

    Pas de choix:
    un truc genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    onCreate()
        MSG1.setOnClick(onDisplayMSG2) 
        MSG1.show();
    onDisplayMSG2()
        MSG2.setOnClik(onEnd)
        MSG2.show();
    onEnd()
        ... reste du code ...
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  8. #8
    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
    show() affiche, ok, mais il affiche qd même 1 dialog box contenant un bouton, donc la moindre des choses serait d'attendre qu'on valide ce bouton avant de continuer à dérouler le code, non?

  9. #9
    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
    Non.... onCreate affiche une fenêtre... et pourtant il attend rien à la fin...
    C'est fini depuis 10/20 ans l'époque des fenêtres modales qui bloquaient les applis....
    D'ailleurs la méthode est "show()" pas "doModal()"


    D'ailleurs une AlertDialog n'est qu'un hack pour ne pas faire d'activity supplémentaire... on pourrait très bien faire la même chose avec une activity (je ne sais pas d'ailleurs si c'est pas ce qu'il fait "behind the scene").... donc avec: startActivityForResult(); (qui retourne de suite)
    et le résultat dans onActivityResult()

    Et je continue avec les "ProgressDialog"... qui si elles ne revenaient jamais (pourtant y a un bouton cancel peut-etre), ne serviraient à rien ^^
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  10. #10
    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, m'arrange pas tout ça, mais si c'est pas possible...
    Merci.

  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
    question subsidiaire dont tu auras peut être la réponse, sinon je ferai un autre topic:

    -> quel est le délais entre l'upload d'une app sur le PlayStore & sa mise en ligne?
    -> je suppose qu'ils doivent faire un minimum de check avant?

  12. #12
    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
    Les checks sont automatiques dans la plupart des cas...
    Si j'ai bien compris une de leur keynote, si l'appli ne demande aucun privilège c'est quasi instantanné... si l'appli demande 283823 autorisations, il se peut que ca passe entre les mains de quelqu'un ^^

    Sinon le délai c'est 12h à 48h je crois, le temps que les serveurs de cache se mettent à jour....
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  13. #13
    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, merci.

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 13/10/2008, 18h07
  2. Réponses: 1
    Dernier message: 31/08/2007, 13h19
  3. Erreur IDE Delphi 7 sous Windows 2003
    Par dd16 dans le forum Delphi
    Réponses: 1
    Dernier message: 20/12/2006, 10h00
  4. erreur d'exécution '48' sur windows 98 SE
    Par florenzo28 dans le forum Windows 2000/Me/98/95
    Réponses: 1
    Dernier message: 18/02/2006, 22h27
  5. impossible d'activer pare-feu windows
    Par slim dans le forum Sécurité
    Réponses: 4
    Dernier message: 05/02/2006, 20h43

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