Android GameLoopThread stürzt beim 2ten start der App ab?

bruce85

Bekanntes Mitglied
Hallo,
ich habe 3 Java Klassen (GameActivity.java, GameLoopThread.java und GameView).
In der GameView.java erstelle ich dann diesen Thread:
Java:
public GameView(Context context) {
		super(context);

		
		theGameLoopThread = new GameLoopThread(this);
		
		surfaceHolder = getHolder();
		surfaceHolder.addCallback(new SurfaceHolder.Callback() {

			public void surfaceDestroyed(SurfaceHolder holder) {
                boolean retry = true;
                theGameLoopThread.setRunning(false);
                while(retry){
                    try {
                        theGameLoopThread.join();
                        retry=false;
                    }catch(InterruptedException e){

                    }
                }

            }

            public void surfaceCreated(SurfaceHolder holder) {
                theGameLoopThread.setRunning(true);
                theGameLoopThread.start();
                
                Canvas c = null;
                try {
                	c = holder.lockCanvas(null);
                	synchronized (holder) {
                		onDraw(c);
                	}
                } finally {
                // do this in a finally so that if an exception is thrown
                // during the above, we don't leave the Surface in an
                // inconsistent state
                	if (c != null) {
                		holder.unlockCanvasAndPost(c);
                	}
                }
            }

			public void surfaceChanged(SurfaceHolder holder, int format,
					int width, int height) {
			}
		});
	}

Es läuft auch alles sehr gut, bis ich die App mit der Home-Button verlasse und dann wieder starten möchte, dann stürzt die app ab:
Java:
09-25 03:48:12.222: E/AndroidRuntime(28211): FATAL EXCEPTION: main
09-25 03:48:12.222: E/AndroidRuntime(28211): java.lang.IllegalThreadStateException: Thread already started.
09-25 03:48:12.222: E/AndroidRuntime(28211): 	at java.lang.Thread.start(Thread.java:1045)
09-25 03:48:12.222: E/AndroidRuntime(28211): 	at eu.test.testapp.GameView$1.surfaceCreated(GameView.java:86)
09-25 03:48:12.222: E/AndroidRuntime(28211): 	at android.view.SurfaceView.updateWindow(SurfaceView.java:586)
09-25 03:48:12.222: E/AndroidRuntime(28211): 	at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:236)
09-25 03:48:12.222: E/AndroidRuntime(28211): 	at android.view.View.dispatchWindowVisibilityChanged(View.java:7778)
09-25 03:48:12.222: E/AndroidRuntime(28211): 	at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1080)
09-25 03:48:12.222: E/AndroidRuntime(28211): 	at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1080)
09-25 03:48:12.222: E/AndroidRuntime(28211): 	at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1080)
09-25 03:48:12.222: E/AndroidRuntime(28211): 	at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1443)
09-25 03:48:12.222: E/AndroidRuntime(28211): 	at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1183)
09-25 03:48:12.222: E/AndroidRuntime(28211): 	at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4863)
09-25 03:48:12.222: E/AndroidRuntime(28211): 	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
09-25 03:48:12.222: E/AndroidRuntime(28211): 	at android.view.Choreographer.doCallbacks(Choreographer.java:562)
09-25 03:48:12.222: E/AndroidRuntime(28211): 	at android.view.Choreographer.doFrame(Choreographer.java:532)
09-25 03:48:12.222: E/AndroidRuntime(28211): 	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
09-25 03:48:12.222: E/AndroidRuntime(28211): 	at android.os.Handler.handleCallback(Handler.java:725)
09-25 03:48:12.222: E/AndroidRuntime(28211): 	at android.os.Handler.dispatchMessage(Handler.java:92)
09-25 03:48:12.222: E/AndroidRuntime(28211): 	at android.os.Looper.loop(Looper.java:137)
09-25 03:48:12.222: E/AndroidRuntime(28211): 	at android.app.ActivityThread.main(ActivityThread.java:5328)
09-25 03:48:12.222: E/AndroidRuntime(28211): 	at java.lang.reflect.Method.invokeNative(Native Method)
09-25 03:48:12.222: E/AndroidRuntime(28211): 	at java.lang.reflect.Method.invoke(Method.java:511)
09-25 03:48:12.222: E/AndroidRuntime(28211): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
09-25 03:48:12.222: E/AndroidRuntime(28211): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
09-25 03:48:12.222: E/AndroidRuntime(28211): 	at dalvik.system.NativeStart.main(Native Method)

Wenn die App verlassen wird, dann setze ich setRunning vom Thread auf false:
Java:
@Override
protected void onPause() {
	super.onPause();
	gameView.theGameLoopThread.setRunning(false);
}

Wie kann man den Thread richtig pausieren beim verlassen der App über den Home-Button und wieder richtig fortsetzen, beim wiederöffnen der App?

So klappt das auch nicht:
Java:
gameView.theGameLoopThread.setRunning(true);

Oder geht der Thread verloren, wenn ich die App verlasse über den Home-Button?

Ich wäre euch sehr dankbar, wenn mir da jemand weiterhelfen könnte.

MfG
 

stKev

Mitglied
Hallo Bruce,

du versuchst ja dein Thread zu joinen, wenn vom SurfaceHolder die surfaceDestroyed(..) Methode aufgerufen wird. Hast du dafür einen speziellen Grund? Ich würde den Thread einfach über deine Activity Klasse händeln. Dafür überschreibst du die onResume(..) und die onPause(..).
Dann kannst du in der onResume(..) isRunning(true) und den Thread neustarten. In der onPause(..) denn join durchführen.
 

bruce85

Bekanntes Mitglied
Ich Danke Dir.

Leider klappt das auch nicht:
Java:
09-25 13:12:05.638: W/dalvikvm(18047): threadid=1: thread exiting with uncaught exception (group=0x41abaac8)
09-25 13:12:05.638: E/AndroidRuntime(18047): FATAL EXCEPTION: main
09-25 13:12:05.638: E/AndroidRuntime(18047): java.lang.IllegalThreadStateException: Thread already started.
09-25 13:12:05.638: E/AndroidRuntime(18047): 	at java.lang.Thread.start(Thread.java:1045)
09-25 13:12:05.638: E/AndroidRuntime(18047): 	at eu.test.testapp.GameView$1.surfaceCreated(GameView.java:86)
09-25 13:12:05.638: E/AndroidRuntime(18047): 	at android.view.SurfaceView.updateWindow(SurfaceView.java:586)
09-25 13:12:05.638: E/AndroidRuntime(18047): 	at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:236)
09-25 13:12:05.638: E/AndroidRuntime(18047): 	at android.view.View.dispatchWindowVisibilityChanged(View.java:7778)
09-25 13:12:05.638: E/AndroidRuntime(18047): 	at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1080)
09-25 13:12:05.638: E/AndroidRuntime(18047): 	at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1080)
09-25 13:12:05.638: E/AndroidRuntime(18047): 	at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1080)
09-25 13:12:05.638: E/AndroidRuntime(18047): 	at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1443)
09-25 13:12:05.638: E/AndroidRuntime(18047): 	at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1183)
09-25 13:12:05.638: E/AndroidRuntime(18047): 	at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4863)
09-25 13:12:05.638: E/AndroidRuntime(18047): 	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
09-25 13:12:05.638: E/AndroidRuntime(18047): 	at android.view.Choreographer.doCallbacks(Choreographer.java:562)
09-25 13:12:05.638: E/AndroidRuntime(18047): 	at android.view.Choreographer.doFrame(Choreographer.java:532)
09-25 13:12:05.638: E/AndroidRuntime(18047): 	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
09-25 13:12:05.638: E/AndroidRuntime(18047): 	at android.os.Handler.handleCallback(Handler.java:725)
09-25 13:12:05.638: E/AndroidRuntime(18047): 	at android.os.Handler.dispatchMessage(Handler.java:92)
09-25 13:12:05.638: E/AndroidRuntime(18047): 	at android.os.Looper.loop(Looper.java:137)
09-25 13:12:05.638: E/AndroidRuntime(18047): 	at android.app.ActivityThread.main(ActivityThread.java:5328)
09-25 13:12:05.638: E/AndroidRuntime(18047): 	at java.lang.reflect.Method.invokeNative(Native Method)
09-25 13:12:05.638: E/AndroidRuntime(18047): 	at java.lang.reflect.Method.invoke(Method.java:511)
09-25 13:12:05.638: E/AndroidRuntime(18047): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
09-25 13:12:05.638: E/AndroidRuntime(18047): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
09-25 13:12:05.638: E/AndroidRuntime(18047): 	at dalvik.system.NativeStart.main(Native Method)

Kannst Du mir vielleicht einen beispiel posten?

MfG
 

bruce85

Bekanntes Mitglied
Hier sind mal die Codes, wie ich es versucht hatte.

GameActivity.java:
Java:
public class GameActivity extends Activity {
	GameView gameView;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
        gameView = new GameView(this);
        setContentView(gameView);
        
        gameView.theGameLoopThread = new GameLoopThread(gameView);
	}
	
	@Override
	protected void onPause() {
		super.onPause();
		boolean retry = true;
		gameView.theGameLoopThread.setRunning(false);
        while(retry){
            try {
            	gameView.theGameLoopThread.join();
                retry=false;
            }catch(InterruptedException e){

            }
        }
	}

	@Override
	protected void onResume() {
		super.onResume();
		gameView.theGameLoopThread.setRunning(true);
	}
	
	@Override
	protected void onDestroy() {
		super.onDestroy();
	}
	
	@Override
	protected void onStop() {
		super.onStop();
	}
}

GameView.java:
Java:
public class GameView extends SurfaceView implements SurfaceHolder.Callback {
	GameLoopThread theGameLoopThread;
	
	
	
	public GameView(Context context) {
		super(context);

		getHolder().addCallback(this);
	}
	
	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		// TODO Auto-generated method stub
    	theGameLoopThread.setRunning(true);
    	theGameLoopThread.start();
        
        Canvas c = null;
        try {
        	c = holder.lockCanvas(null);
        	synchronized (holder) {
        		onDraw(c);
        	}
        } finally {
        // do this in a finally so that if an exception is thrown
        // during the above, we don't leave the Surface in an
        // inconsistent state
        	if (c != null) {
        		holder.unlockCanvasAndPost(c);
        	}
        }
	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		// TODO Auto-generated method stub
        
	}

	@Override
    public boolean onTouchEvent(MotionEvent e) {


            if(e.getAction() == MotionEvent.ACTION_DOWN) {

            }

            if(e.getAction() == MotionEvent.ACTION_UP) {

 	        }
            
            return true;
    }
	
	@Override
	protected void onDraw(Canvas canvas) {

	}
}

GameLoopThread.java:
Java:
public class GameLoopThread extends Thread {
	private GameView theView;
	private boolean isRunning = false;

	public GameLoopThread(GameView theView) {
		this.theView = theView;
	}

	public void setRunning(boolean run) {
		isRunning = run;
	}

	@Override
	public void run() {
		while (isRunning) {
			Canvas theCanvas = null;
			try {
				theCanvas = theView.getHolder().lockCanvas();
				synchronized (theView.getHolder()) {
					theView.onDraw(theCanvas);
				}
			} finally {
				if (theCanvas != null) {
					theView.getHolder().unlockCanvasAndPost(theCanvas);
				}
			}
		}
	}
}

Ich weiss echt nicht mehr weiter.
Immer wenn ich kurz aus der App gehe und dann wieder starten möchte, sagt er Thread already started.

Wie kann ich das ambesten beheben?

Ich bedanke mich schonmal im Voraus.

MfG
 
Zuletzt bearbeitet:

stKev

Mitglied
Ich würde den Thread ein Attribut der Activity Klasse werden lassen. So sind die Klassen über ihr Attribute nicht so "verbunden". Bereinige die GView erstmal von allen Thread Resten. Ansonsten denke ich fehlt nur noch ein gameLoop.start() in der onResume(..).

Wieso wolltest du das denn ursprünglich mittels SurfaceHolder.CallBack lösen? Halte ich für komplizierter.
Weiß nun nicht welcher Thread die surfaceDestroy(..) aufruft, aber halte es für bedenklich diesen Thread einfach warten zu lassen, bis da son kleiner GameLoop mal auf den Canvas geschmiert hat und dann gestorben ist. :) Was ja der Aufruf join() + isRunning(false) bezweckt. Der join() in der onPause(..) lässt ja nur ein Thread warten, der nun eh grade nicht benötigt wird, der versteht sicher das er kurz warten muss.

Hoffe du kriegst es gelöst. :) Denke bist auf dem richtigen Weg mit den Änderungen.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
B GameLoopThread Pause and Resume? Android & Cross-Platform Mobile Apps 7
W App stürzt bei 2. Foto ab Android & Cross-Platform Mobile Apps 3
K App stürzt ab Android & Cross-Platform Mobile Apps 29
I Android Auf ImageView aus einem anderen Thread zugreifen liefert Fehlermeldung (App stürzt ab) Android & Cross-Platform Mobile Apps 5
O Google Admob Ad wird nicht geladen und App stürzt ab Android & Cross-Platform Mobile Apps 1
L App stürzt ab. Android & Cross-Platform Mobile Apps 2
T Android Eigene App stürzt ab Android & Cross-Platform Mobile Apps 3
J Android App stürzt ab wenn neue activity gestartet Android & Cross-Platform Mobile Apps 6
W getSystemService(SENSOR_SERVICE) - App stürzt ab Android & Cross-Platform Mobile Apps 5
E Android App stürzt nach Modifizierung ab Android & Cross-Platform Mobile Apps 2
P Android Programm stürzt ab - Es geht um Netzwerk Android & Cross-Platform Mobile Apps 5
J MIDlet installieren - Telefon stürzt ab! Android & Cross-Platform Mobile Apps 3
R Android Löschfunktion beim Wischen Android & Cross-Platform Mobile Apps 10
W Rand ändern beim ImageView bei Picasso Android & Cross-Platform Mobile Apps 1
Arif Android Android Studio: Fehler beim Einbinden fremder Bibliothek? Android & Cross-Platform Mobile Apps 2
L App stürtzt ab beim öffnen Android & Cross-Platform Mobile Apps 1
JavaWolf165 Android Fehler beim Speichern/Downloaden einer Datei Android & Cross-Platform Mobile Apps 2
S Android Probleme beim Verbinden mit einer HTTPS Seite Android & Cross-Platform Mobile Apps 4
M Android Fehler beim Parsen. Android & Cross-Platform Mobile Apps 29
V Android Fehlermeldung beim Öffnen von Eclipse nach Installation der Android Erweiterung Android & Cross-Platform Mobile Apps 4
M Error beim drücken der Zurück-Taste am Handy Android & Cross-Platform Mobile Apps 2
S Fehler beim Textdatei einlesen!? Android & Cross-Platform Mobile Apps 7
A Fehlermeldung beim ändern der ViewGroup. Android & Cross-Platform Mobile Apps 6
H Buttons färben sich mit, beim Hintergrund ändern Android & Cross-Platform Mobile Apps 3
A Mehrere Fehler beim Compilieren Android & Cross-Platform Mobile Apps 4
G Problem beim Rendern von 3D-Objekt Android & Cross-Platform Mobile Apps 0
L Android OutOfMemory beim erneuten Starten der App Android & Cross-Platform Mobile Apps 2
N Android Retain Dialog verschwindet beim drehen Android & Cross-Platform Mobile Apps 4
K Nullpointer beim Löschen von Datenbankeintrag, je nachdem wo der Befehl steht Android & Cross-Platform Mobile Apps 5
S Java ME Exception beim Abspielen von Musik Android & Cross-Platform Mobile Apps 6
G Fehler beim Import "Invalid project description" Android & Cross-Platform Mobile Apps 2
G unterschiedliches Verhalten beim Installieren des App auf dem Smartphone Android & Cross-Platform Mobile Apps 3
K Android schwarzer Bildschirm beim Rendern von Text und Dreiecken Android & Cross-Platform Mobile Apps 9
DaniSahne96 Problem beim Appdebuggen auf Smartphone Android & Cross-Platform Mobile Apps 3
P Android Problem beim Widget - Denkfehler ? Android & Cross-Platform Mobile Apps 2
A Fehler beim Starten eines Intents - alles in einer Klasse funktioniert... Android & Cross-Platform Mobile Apps 4
J Android Verhalten beim Hinzufügen neuer Views? Android & Cross-Platform Mobile Apps 6
S Android Fehler beim Anzeigen meines Apps auf Galaxy Tab Android & Cross-Platform Mobile Apps 4
G Beziehung von THIS beim Imageadapter und AsyncTask Android & Cross-Platform Mobile Apps 7
V [Java] und [JavaME] ClientServer StreamConnection . Problem beim lesen / schreiben Android & Cross-Platform Mobile Apps 2
R Ein Problem beim ausführen von folgendem Quelltext Android & Cross-Platform Mobile Apps 11
N Error in HTTP operation beim KXML parsen Android & Cross-Platform Mobile Apps 7
A Problem beim Subtrahieren eines Double von einem Double Android & Cross-Platform Mobile Apps 5
G fehldermeldung beim klicken auf "build" Android & Cross-Platform Mobile Apps 8
L SecurityException beim lesen/schreiben eine Datei Android & Cross-Platform Mobile Apps 7
F Problem beim Erstellen der Jar File Android & Cross-Platform Mobile Apps 4
S createPlayer beim Entwickeln Android & Cross-Platform Mobile Apps 6

Ähnliche Java Themen

Neue Themen


Oben