2014-06-27 4 views
0

Le projet sur lequel je travaille, qui utilise BlackBerry SDK 6, a signalé un bogue dans lequel la fermeture d'un MainScreen entraîne une perte de focus de l'application et un blocage du message. sur la sortie de la console est foreground app ******* lost focus it has no screens. Permettez-moi de clarifier que ce message est affiché même si un écran sur l'application reste visible, mais en quelque sorte l'application a perdu le focus.L'application BlackBerry perd son focus et provoque le gel de l'application

Je n'ai pas été en mesure de déterminer quelles sont les conditions pour déclencher ce bug, j'ai essayé de prendre le cas où de nombreux MainScreens sont ouverts, puis je les ai fermés en appuyant sur le bouton retour. Je vais essayer de mettre à jour avec une sortie beaucoup plus claire lorsque je déclencherai ce bug.

Sur chaque MainScreen la méthode onClose est outrepassée appeler une méthode dans notre classe ScreenManager, une classe, nous avons créé pour gérer l'ouverture et la fermeture de nos MainScreens, le code pour qu'il ressemble à ceci:

pubic void back() 
{ 
    if(pageStack.size() - 1 == 0) { 
    // if only one screen is in our stack collection, show a prompt asking if user wants to close app 
    int choose=Dialog.ask(Dialog.D_YES_NO, ui.getRb().getString(ui.EXIT_YES_NO)); 
    if(choose==Dialog.YES) 
    { 
     System.exit(0); 
    } 
    } else { 
    // in case our stack of screens has more than one screen remaining then pop it for our stack 
    popPageStack(); 
    } 
} 

le code pour popPageStack est la suivante:

private void popPageStack() { 
    pageStack.removeElementAt(pageStack.size()-1); 
    UiApplication.getUiApplication().popScreen(UiApplication.getUiApplication().getActiveScreen()); 
} 

est-il possible que lors de l'appel est la cause écran anti-pop pour cela? Je commence juste à développer sur BlackBerry donc je ne sais pas si une situation où un appel popScreen est fait et alors que l'écran avant que le poped est en cours de rendu peut aucun écran sur l'application cas est possible?

EDIT

J'ai fait un projet d'essai avec un élément de menu que lorsque vous cliquez dessus, supprime le seul écran affiché, après que le comportement que je décrit plus haut est arrivé. En effet, je suis à court d'écrans en quelque sorte et le dernier affiché reste "affiché", mais aucune interaction ne peut être faite, car il a déjà été sorti.

Je vérifie mon projet d'origine, mais je ne comprends pas comment je peux déclencher un appel onClose lorsque je ne fais que reculer en utilisant le bouton de retour. Quoi qu'il en soit, si je devais atteindre la dernière fenêtre, alors une boîte de dialogue devrait apparaître demandant si l'application devrait être proche.

EDIT 2

j'ai pu reproduire le bug deux fois, même si après plusieurs essais. La sortie de la console je suis arrivé était le suivant:

[0.0] JVM: BKLT @ 12347710: SetTimer 30 [0.0] IUE: Focus - Cible perdue, prev = null, null = entrée, app = com.yallaya. [email protected] [0.0] UIE: L'application au premier plan [email protected] a perdu le focus car elle a aucun écran. [0.0] UIE: Focus - cible perdue, prev = null, entrée = null, [email protected] [0.0] UIE: application au premier plan [email protected] perdu de vue parce que il n'a pas d'écrans. [0.0] UIE: L'application de premier plan [email protected] n'a pas d'écran . Cela devrait être corrigé. [0.0] UIE: application au premier plan [email protected] en ignorant l'écran tactile tactile/cliquez car il n'y a pas d'écran cible [0.0]. [0.0] JVM: bklt @ 12377703: timer [0.0] JVM: bklt [1] @ 12377703: usrIdle 27, usrTime 30, usrAct 1 [0.0] JVM: bklt [1] @ 12377703: chkIdle 29, currTime 30 [ 0.0] JVM: bklt @ 12377703: setTimer 3 [0.0] JVM: bklt @ 12380734: horloge [0.0] JVM: bklt [1] @ 12380734: usrIdle 30, usrTime 30, usrAct 1 [0.0] JVM: bklt [1] @ 12380734: chkIdle 33, currtime 30 [0.0] JVM: bklt [1] @ 12380734: enableBacklight 0 [0.0] JVM: bklt [1]: setTimeout 30 [0.0] JVM: bklt [1] @ 12386796: JBSC activé = 0 [0.0] JVM: bklt [1] @ 12386796: SC 0 [0.0] JVM: bklt [1]: setTimeout 30 [0.0] JVM: bklt [1] @ 12388023: JBSC sur = 1 [0.0] JVM: BKLT [1] @ 12388023: SC 1 [0.0] JVM: BKLT @ 12388023: SetTimer 30

Chaque fois que j'essayé d'interagir avec l'écran (soit tactile ou matériel entrée), la ligne [0.0] UIE: Foreground app [email protected] has no screens. This should be corrected. montrerait.

Est-ce que cela donne un indice sur où est mon problème?

+0

Question similaire posée sur le forum BB ici: http://supportforums.blackberry.com/t5/Java-Development/App-freezes-when-closing-a-MainScreen-loses-focus-and-says-it/td-p/ 2918548 –

Répondre

0

@Uriel Arvizu

Depuis que nous devons avoir au moins un écran présent sur la pile d'affichage nous l'appelons écran parent par convention (pas un concept) si nous Poping cet écran de la pile d'affichage et d'essayer d'exécuter quoi que ce soit Ensuite, il affichera le blocage de l'appareil ou le retard d'écran ...

Ainsi, lorsque vous implémentez la méthode popscreen, je vous suggère de l'implémenter sur votre classe d'écran (qui étend l'écran principal) et de lui fournir "ceci" qui est actuel instance de l'écran .. et vous pouvez appeler la méthode pour afficher un écran sur le bouton de retour cliquez comme:

ButtonField buttonBack = new ButtonField(new StringProvider("Back")); 

buttonBack.setChangeListener(new FieldChangeListener() { 
    public void fieldChanged(Field field, int context) { 
     closeThisScreen(); 
    } 
}); 
méthode

pour fermer cet écran dans la même classe

void closeThisScreen() { 
    UiApplication.getUiApplication().popScreen(this); 
} 

Quand il affiche le bouton retour écran et appuyez sur l'utilisateur à domicile affiche un message puis fermez l'application mettre en œuvre ce sur l'écran d'accueil

public boolean onClose() 
     { 
      int response = Dialog.ask(Dialog.D_YES_NO,"Are you sure you want exit?"); 
      if (response == -1) 
      { 
       return false; 
      } 
      else 
      { 
       System.exit(0); 
       return true; 
      } 
     } 
+0

J'ai testé et je n'ai pas été en mesure de trouver un modèle spécifique à r Produire le bug, c'est tellement erratique, parfois ça se passe sur un écran puis sur un autre, ça n'arrive pas toujours. Serait-ce que je manque de mémoire? Vérifiez la nouvelle modification sur ma question, j'ai ajouté le message que je reçois sur la console de sortie. –

Questions connexes