Java 游戏循环没有破坏
背景 我已经创建了一个游戏循环来运行UI,但是当我从游戏屏幕SingleGameActivity按下后退按钮时,我会进入名为StartVActivity的级别选择器菜单。如果我试图重新进入游戏或从StartVActivity按下后退按钮,我会收到keyDispatchingTimedOut错误ANR。 当我写日志消息时,游戏活动SingleGameActivity只是暂停了,当我按下后退按钮时,它没有停止。当我结束活动时,游戏循环从未被破坏 问题 1.为什么当我按下游戏菜单上的后退按钮时,游戏循环没有被破坏?我的意思是,当onPaused被调用时,为什么不调用surfaceDestroyed呢?onStop从未被调用过,我不知道为什么 如何访问/data/anr/traces.txt 我如何处理这些错误 如果您能回答这些问题中的任何一个,我将不胜感激 编辑 这是一个surface view类,我从这里开始并销毁线程,或者看起来我只是在启动它,因为当我按下back按钮时它不会关闭Java 游戏循环没有破坏,java,android,Java,Android,背景 我已经创建了一个游戏循环来运行UI,但是当我从游戏屏幕SingleGameActivity按下后退按钮时,我会进入名为StartVActivity的级别选择器菜单。如果我试图重新进入游戏或从StartVActivity按下后退按钮,我会收到keyDispatchingTimedOut错误ANR。 当我写日志消息时,游戏活动SingleGameActivity只是暂停了,当我按下后退按钮时,它没有停止。当我结束活动时,游戏循环从未被破坏 问题 1.为什么当我按下游戏菜单上的后退按钮时,游戏循
@Override
public void surfaceCreated(SurfaceHolder holder) {
thread.setRunning(true);
thread.start();
Log.d(TAG, " surface created");
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
boolean retry = true;
while (retry) {
try {
thread.join();
retry = false;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Log.d(TAG, " surface destroyed");
}
编辑2与解决方案
通过更改这段代码修复了该错误:
boolean retry = true;
while (retry) {
try {
thread.join();
retry = false;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
为此:
thread.setRunning(false);
为什么??
是因为我需要在销毁线程之前停止线程吗?你从哪里进入游戏循环?也许运行游戏循环的同一个线程负责停止你的应用程序,但它不能,因为它被困在游戏循环中?我对线程不是很熟悉,因为我是一个初学者,但如果你能教我如何解决这个问题,我会很高兴的!:Thread.join将等待线程退出。但是如果它自己不打算退出,并且您没有向它发送任何信号,那么它就不会退出,而名为thread.join的主线程将永远等待另一个线程。好的!那么,我是否以正确的方式解决了这个问题?通过添加thread.setRunningfalse?它至少工作得很好:取决于thread.setRunningfalse的功能。如果它向游戏循环线程发出退出游戏循环并完成的信号,那么应该可以工作。尝试在surfaceDestroyed开始之前的代码之前添加thread.setRunningfalse,看看是否有效。让主线程在surfaceDestroyed after循环结束时加入游戏循环线程后打印日志消息。如果打印,则可以确保游戏循环线程已退出,并且主循环已退出循环,即未被卡住。
thread.setRunning(false);