Question

Je reçois actuellement aux prises avec Android, jouer avec l'échantillon Lander Lunar.

J'ai trouvé que si vous quittez l'application (par exemple, cliquez sur le bouton d'appel), il détruirai la surface sous-jacente (appelant surfaceDestroyed).

Naviguer en arrière (qui déclenchera onWindowVisibilityChanged) l'application se bloque, car il va essayer de tirer à la surface sans le recréer.

Y at-il un code que je peux mettre en <=> (ou ailleurs) qui régénérer la surface sous-jacente de la SurfaceView et reprendre l'exécution bien?

Il se sent comme cela devrait être un simple appel de fonction, mais je ne peux pas trouver quoi que ce soit dans l'API docs.

Merci!

Était-ce utile?

La solution 2

Mis-de télédiagnostic

! L'application recrée la surface automatiquement, mais il y a un appel là-dedans qui tente d'attirer à lui avant qu'il ne soit créé.

Fixation du problème:

boolean mSurfaceExists;
...
public void surfaceDestroyed(SurfaceHolder holder) {
    mSurfaceExists = false;
    ...
}

public void surfaceCreated(SurfaceHolder holder) {
    mSurfaceExists = true;
    ...
}

protected void onWindowVisibilityChanged(int visibility) {
    // only call base if there's a surface
    if(mSurfaceExists)
        super.onWindowVisibilityChanged(visibility);
}

Maintenant, il est tout houle. (Pour autant que je sache, en tout cas - Java / Android experts ne hésitez pas à commenter si cela est une mauvaise pratique)

Autres conseils

Cette solution pour « mSurfaceExists = true » ne fonctionne pas pour moi non plus. Il ressemble à surfaceCreated () n'est pas appelé parce que super.onWindowVisibilityChanged () n'est pas appelé. Il n'y a donc pas de surface créé et il ne tombe pas en panne parce threas.start est pas appelé.

Je crois que le problème est le suivant: Appel Thread.Start () provoque l'erreur parce que le fil était déjà commencé. Mais dans surfaceDestroyed (), Thread.join provoque le fil à remplir et à mourir. Et un fil ne peut pas être redémarré une fois mort.

Je devine l'astuce consiste à créer un nouveau thread dans surfacecreated ou seulement faire le fil à remplir lorsque l'utilisateur appelle l'application à la fin (touche retour) et non une pause (touche d'accueil). Cela peut être vérifié en appelant isFinishing () sur l'activité.

Je ne sais pas si cela va fonctionner. Je vais essayer ce bientôt.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top