背景 我已经创建了一个游戏循环来运行UI,但是当我从游戏界面推动后退按钮(SingleGameActivity)时,我会进入名为(StartLvlActivity)的关卡选择器菜单。如果我尝试重新进入游戏或从StartLvlActivity按下后退按钮,我会收到keyDispatchingTimedOut错误(ANR)。 当我写日志消息时,游戏活动(SingleGameActivity)只是暂停,而不是在我按下后退按钮时停止。当我关闭活动时,游戏循环从未被破坏。
08-03 09:56:12.130: I/Process(346): Sending signal. PID: 5763 SIG: 3
08-03 09:56:12.130: I/dalvikvm(5763): threadid=3: reacting to signal 3
08-03 09:56:12.333: I/dalvikvm(5763): Wrote stack traces to '/data/anr/traces.txt'
08-03 09:56:12.341: E/ActivityManager(346): ANR in com.coderogden.pongtennis (com.coderogden.pongtennis/.activities.StartLvlActivity)
08-03 09:56:12.341: E/ActivityManager(346): Reason: keyDispatchingTimedOut
问题 1.当我从游戏菜单中按下后退按钮时,为什么游戏循环没有被破坏?我的意思是,为什么在调用onPaused时没有调用surfaceDestroyed(onStop从未调用过,我也不知道为什么......)。
如何访问" /data/anr/traces.txt"
如何处理错误?
如果你能回答任何这些问题,我会非常感激!
修改
这是我从哪里开始并销毁线程的表面视图类(或者我刚刚启动它,因为当我按下"后退" -button时它不会关闭)。
@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);
WHY吗 是因为我需要在销毁它之前停止它吗?