Frage

Just kommen meine Anwendung zu polieren und macht es wieder aufnehmen, nachdem der Benutzer verlassen hat. Wenn die Anwendung wieder erhalte ich eine IllegalThreadStateException, was ziemlich ärgerlich. Dieses Problem ist in dem Beispiel Google gibt Lunar Lander . Hat jemand eine Möglichkeit zur Wiederherstellung arbeitet bei der Verwendung von Surface gefunden?

War es hilfreich?

Lösung

Ich glaube, das von einer Disparität entsteht, wie die Oberfläche und die Aktivität behandelt werden. Wenn Sie die LunarLander Anwendung verlassen die Oberfläche zerstört wird (Aufruf surfaceDestroyed), aber die Aktivität angehalten nur (Aufruf onPause). Wenn die Aktivität wieder aufgenommen wird die Oberfläche erstellt wird (Aufruf surfaceCreated) und er versucht, wieder die Zeichnung Thread zu starten.

Das bedeutet, dass das Thema zu schaffen mit den Lifecycle-Aktivitäten geschieht und den Faden mit dem Lebenszyklus des Surface geschieht zu zerstören, die entsprechen nicht immer tun, damit die IllegalThreadStateException. Die Lösung wäre, den Faden zu einem Lebenszyklus oder die andere zu binden, nicht beide.

Ich denke, dieses Thema eine mögliche Lösung vorgeschlagen, obwohl ich nicht weiß, wenn es funktioniert.

Andere Tipps

In meinem eigenen Test schaffe ich die Zeichnung Thread im surfaceCreated () -Methode, und dies löst das Problem vollständig. Dies ist meine Methode Umsetzung:

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

So in dem Code, wenn surfaceDestroyed() genannt wird, setzt es mRun auf false und ruft thread.join(). Dies bewirkt, dass der Thread zu vervollständigen und zu sterben. Wenn die App gestartet wird, wieder und surfaceCreated() aufgerufen wird, ruft es thread.start(). Dies ist ungültig, weil der Thread kann nicht gestartet werden, nachdem er stirbt.

Zwei Optionen zu beheben:

a) Starten Sie einen neuen Thread in surfaceCreated() -. Wie oben

b) Oder einen Scheck in surfaceDestroyed() gegen Activity.isFinishing() in das nur das Fadenende, wenn wahr. Um dies zu tun, umgab ich die while(mRun) im Thread mit einer anderen while-Schleife, das nur auf false gesetzt, wenn isFinishing() true zurück.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top