我正在使用LunarLander API演示开发适用于Android的RPG。我已经使用这个演示制作了一个游戏(Porcupine Assassin,检查出来!)所以我已经很好地掌握了Canvas类和那种性质的东西。
我的问题是,在RPG中你需要一种方法来访问库存,统计数据等。所以我设置了BACK按钮来启动类Inventory.java。当我完成()库存活动并尝试返回游戏(SurfaceView)时,我遇到了问题。
这是SurfaceCreated()回调:
public void surfaceCreated(SurfaceHolder holder) {
thread.setRunning(true);
thread.start();
}
我得到了由“IllegalThreadStateException:线程已经启动”引起的FC,所以我在SurfaceCreated()回调中放了一个try / catch。使用try / catch,没有FC发生,但我回到了黑屏。
我尝试了try / catch并在开头添加一个检查:if(!thread.isAlive())。这样,如果线程已经启动,它就不会做任何事情。奇怪的是,我得到了相同的FC“线程已经启动”所以thread.isAlive()必须返回false .. ??
我也有来自API的onWindowFocusChanged()方法:
@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
if (!hasWindowFocus) thread.pause();
else thread.setState(STATE_RUNNING);
}
我非常热衷于游戏方面,我已经为我的RPG奠定了大部分基础。但是,所有这些Android / Java的东西都超越了我的脑海。有人能指出我正确的方向吗?
答案 0 :(得分:4)
这是因为您正在尝试重新启动已终止的线程,因此.IsAlive()返回false。如果你谷歌LunarLander错误或非法线程或其他东西,有很多关于这个问题的文档。
我发现一次可能的解决方法是:
public void surfaceCreated(SurfaceHolder holder) {
if (thread.getState() == Thread.State.TERMINATED) {
thread = new CascadeThread(getHolder(), getContext(), getHandler());
thread.setRunning(true);
thread.start();
}
else {
thread.setRunning(true);
thread.start();
}
您可以找到完整的文档here