Question

Il suffit de venir à polir ma demande et en faire reprendre après que l'utilisateur a quitté. Lorsque l'application restaure je reçois un IllegalThreadStateException, ce qui est assez gênant. Ce problème est présent dans l'exemple Google donne de Lunar Lander . Quelqu'un at-il trouvé un moyen de restaurer travail lors de l'utilisation surfaceView?

Était-ce utile?

La solution

Je crois que cela découle d'une disparité dans la façon dont la surface et l'activité sont traitées. Lorsque vous quittez l'application LunarLander la surface est détruite (en invoquant surfaceDestroyed), mais l'activité est uniquement mis en pause (invocation OnPause). Lorsque l'activité reprend la surface est créée (invoquant surfaceCreated) et il tente de démarrer à nouveau le fil de dessin.

Cela signifie que la création du fil se produit avec le cycle de vie de l'activité et de détruire le fil se produit avec le cycle de vie de SurfaceView, qui ne correspondent pas toujours, ainsi le IllegalThreadStateException. La solution serait d'attacher le fil à un cycle de vie ou de l'autre, pas les deux.

Je pense que ce fil propose une solution possible, mais je ne sais pas si cela fonctionne.

Autres conseils

Dans mon test, je crée le fil de dessin dans la méthode surfaceCreated (), ce qui permet de résoudre le problème complètement. Ceci est mon implémentation de la méthode:

@Override
public void surfaceCreated(SurfaceHolder arg0) {
    _thread = new DrawThread(getHolder());
    _thread.setRunning(true);
    _thread.start();
}

Ainsi, dans le code, quand surfaceDestroyed() est appelé, il met mRun à faux et appelle thread.join(). Cela provoque le fil à remplir et à mourir. Lorsque l'application est relancée et surfaceCreated() est appelée, elle appelle thread.start(). Ceci est invalide parce que le fil ne peut pas être démarré après sa mort.

Deux options pour résoudre:

a) Lancer un nouveau fil dans surfaceCreated() -. Comme ci-dessus

b) Ou ajouter un chèque surfaceDestroyed() contre Activity.isFinishing() pour mettre fin que le fil si elle est vraie. Pour ce faire, je le while(mRun) entouré dans le fil avec une autre boucle while qui est réglée uniquement false si isFinishing() renvoie true.

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