3

我正在使用 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 的东西。谁能指出我正确的方向?

4

1 回答 1

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();
        }

你可以在这里找到完整的文档

于 2010-10-08T21:22:15.987 回答