java - "Thread already started"恢复 Activity 时

标签 java android multithreading android-lifecycle

这是我的情况: 我正在为 android 构建一个游戏,我的游戏 Activity 由一个自定义 surfaceView 组成,它有一个用于游戏逻辑和渲染的线程。该架构类似于 Google 网站上的 LunarLander 演示。

当 Activity 开始时,它会创建 surfaceView 并调用此方法:

    @Override
    public void surfaceCreated(SurfaceHolder holder)
    {   
        renderThread.start();
    }

当我按下home键退出游戏时,会调用onPause()方法,调用surfaceDestroyed()。在 surfaceDestroyed 中,我通过调用停止游戏线程:

    @Override
    public void surfaceDestroyed(SurfaceHolder holder)
    {
        synchronized(holder)
        {
            renderThread.stop();
        }
    }       

应用程序进入后台正常。然后,当我按下图标重新启动应用程序时,我在日志中收到一条“线程已启动”消息,同时屏幕上出现“强制关闭”弹出窗口。当 Activity 在渲染线程上调用 start() 时进入“surfaceCreated”方法时会出现此消息。

现在我已经研究了几个小时,但无法弄清楚这是为什么。我相信当我关闭应用程序时我的线程已停止,所以我不明白为什么它说它已经开始。

最佳答案

这些方法并不像您认为的那样。来自API doc :

It is never legal to start a thread more than once.

和:

public final void stop() - Deprecated. This method is inherently unsafe.

如果你想暂停一个线程,你必须在线程中使用 Object.wait()Objecft.notifyAll()

关于java - "Thread already started"恢复 Activity 时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3148186/

相关文章:

java - BroadcastReceiver 未收到下载完成操作

java - 如何插入 GridbagLayout 不在 JPanel 的中心放置组件

javascript - react native 的按钮文本总是大写

objective-c - 锁定一个对象不被多个线程访问 - Objective-C

c# - 使用 async/await 限制信号量线程

c++ - 如何安全终止多线程进程

java - 使用 class.ForName 注册 HSQLDB 驱动程序

android - 将折叠工具栏标题更改为微调器

java - Android facebook登录后获取用户信息

java - 适合 Java 的命令行解析和执行