代码之家  ›  专栏  ›  技术社区  ›  Snailer

在另一个活动引起关注后返回SurfaceView

  •  3
  • Snailer  · 技术社区  · 16 年前

    我正在为Android开发一个RPG,使用LunarLander API演示。我已经用这个演示做了一个游戏(豪猪刺客,看看吧!)所以我很好地掌握了画布类和那种性质的东西。

    我的问题是,在rpg中需要一种访问inventory、stats等的方法,所以我设置了BACK按钮来启动inventory.java类。当我完成库存活动并尝试返回游戏(SurfaceView)时遇到问题。

    这是SurfaceCreated()回调:

    public void surfaceCreated(SurfaceHolder holder) {
        thread.setRunning(true);
        thread.start();
    }
    

    我收到了一个由“IllegalThreadStateException:Threadalreadstarted”引起的FC,所以我在SurfaceCreated()回调中放置了一个try/catch。使用try/catch,不会发生FC,但我会返回到黑屏。

    我试着在开头加上一个检查:if(!线程.isAlive()). 这样,如果线程已经启动,它就不会做任何事情。奇怪的是,我得到了同样的FC“线程已经启动”,所以线程.isAlive(必须返回了false…)??

    @Override
    public void onWindowFocusChanged(boolean hasWindowFocus) {
        if (!hasWindowFocus) thread.pause();
        else thread.setState(STATE_RUNNING);
    }
    

    我非常热衷于这方面的游戏,我已经为我的RPG奠定了大部分基础。但我脑子里想的都是Android/Java的东西。有人能指点我正确的方向吗?

    1 回复  |  直到 16 年前
        1
  •  4
  •   user432209    16 年前

    这是因为您正在尝试重新启动终止的线程,因此.IsAlive()返回false。如果你用谷歌LunarLander bug或者非法线程之类的东西,有很多关于这个问题的文档。

    有一次我发现一个可能的解决办法是:

        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