Hier ist meine Situation: Ich baue ein Spiel für Android und meine Spielaktivität besteht aus einem benutzerdefinierten SurfaceView, die einen Thread für die Spiellogik und Rendering hat. Die Architektur ähnelt der LunarLander-Demo von Googles Website."Thread bereits gestartet" beim Fortsetzen der Aktivität
Wenn die Aktivität startet er den Surface erstellt und ruft diese Methode:
@Override
public void surfaceCreated(SurfaceHolder holder)
{
renderThread.start();
}
Wenn ich die Home-Taste drücken um das Spiel zu beenden, die onPause() -Methode aufgerufen, die surfaceDestroyed() aufruft. In surfaceDestroyed stoppen ich das Spiel Thema durch den Aufruf:
@Override
public void surfaceDestroyed(SurfaceHolder holder)
{
synchronized(holder)
{
renderThread.stop();
}
}
Die App geht in den Hintergrund gut. Dann, wenn ich die App neu starte, indem ich auf das Symbol drücke, bekomme ich eine Meldung "Thread bereits gestartet" im Log zusammen mit einem "Force Close" Popup auf dem Bildschirm. Diese Meldung wird angezeigt, wenn die Aktivität beim Aufruf von start() für den Render-Thread die Methode "sourceCreated" aufruft.
Jetzt habe ich es stundenlang untersucht und kann nicht herausfinden, warum das so ist. Ich glaube, dass mein Thread gestoppt wird, wenn ich die App schließe, also verstehe ich nicht, warum es sagt, dass es bereits begonnen hat.
Hallo, danke für die Antwort. Ich ersetzte stop() durch eine join() in einer while-Schleife. Ich glaube es wartet, bevor der Thread gestoppt wird. Aber ich habe immer noch das gleiche Problem, vermisse ich etwas? Wie für den Beginn des Threads. Ich verstehe, dass der Thread nicht mehr als einmal damit die Fehlermeldung gestartet werden kann. Also denkst du, dass ich diesen Fehler bekomme, nur weil der Thread nicht richtig gestoppt wird? Danke – NioX5199
@ NioX5199: nein, Join() stoppt den Thread auch nicht, es wartet auf es selbst zu beenden. Sie erhalten den Fehler, weil der Thread bereits gestartet ist. Threads * können nicht * gestoppt und neu gestartet werden. Wie ich schrieb: Um einen Thread zu pausieren, bis eine Bedingung erfüllt ist, verwenden Sie Object.wait(). –
Er sollte es wahrscheinlich auch nicht so machen. Den Thread neu zu erstellen ist wahrscheinlich ein besserer Ansatz. – alexanderblom