【问题标题】:Android Thread: App hangs when screen turns offAndroid线程:屏幕关闭时应用程序挂起
【发布时间】:2015-03-15 13:18:09
【问题描述】:

我在线程上运行的 SurfaceView 类中使用 Canvas。 SurfaceView 由 Activity (setContentView(surfaceview)) 调用。当屏幕关闭时,它会通过一个 pause() 方法关闭所有循环变量等等。

奇怪的是:在我的平板电脑(Android 4.4.2)上,线程暂停并正确恢复(线程从头开始),但在我的手机(Android 4.2.2)和其他人的手机(CM 11)上)应用程序挂起(它不会崩溃!它只是挂起),我必须杀死它。 LogCat 不打印任何东西 - 但是我试图找出使用 Log.i 会发生什么,似乎在 pause 方法完成后,pause 方法再次启动,这就是应用程序挂起的地方。

我之前检查过,并且暂停/恢复方法被正确调用(使用 super.onPause()/Resume() 和 surfaceview.pause()/resume() 覆盖 Activity 的 onPause/onResume)

我的暂停/恢复方法:

public void resume() {
    countdown = true; // this one,
    threadRun = true;  // this one and
    finishWait = true; // this one each are loop controllers
    won = false;

    hitCount = 0;

    thread = new Thread(this);
    thread.start();
}

public void pause() {
    Log.i("codeflow", "Pause method start");

    // all loop controllers have been set to false
    countdown = false;
    threadRun = false;
    finishWait = false;

    /* Log.i("CodeFlow", "drawablank");
    drawABlankScreen(); // to hide everything drawn */

    while (true) {
        try {
            Log.i("codeflow", "Thread.join() loop");
            thread.join();
            break;
        } catch(InterruptedException e) {
            Log.i("codeflow", "InterruptedException");
            e.printStackTrace();
        }
    }
    thread = null;
    Log.i("codeflow", "Thread is killed");

    if (won && !lost) { // !lost IS necessary
        Log.i("CodeFlow", "save highscore");
        saveHighscore(highscore);
    }

}

pause 方法按其应有的方式遍历所有内容,但随后它再次启动(另一个“Pause 方法启动”)并进入 drawABlankScreen(),或者,当此链接被注释时,它打印“Thread.join()循环”一次,然后应用挂起。

最让我烦恼的是它挂在我的手机上,而不是挂在我的平板电脑上。 谁能帮帮我,我已经搜索了几个小时,一无所获....

【问题讨论】:

  • 你试过在硬件调试的情况下运行它吗?
  • @Kerry 硬件调试?我怎样才能做到这一点? (对不起,我对 android 开发有点陌生)

标签: java android multithreading surfaceview onpause


【解决方案1】:

在 onPause() 中将 UI 线程加入后台线程可能是导致您出现问题的原因。

相反,您应该终止线程。

【讨论】:

  • 哇,只是说“thread = null”并省略 thread.join() 部分确实解决了问题。你能告诉我这是为什么(以及是否有任何副作用)?
  • 说“thread = null”并省略join()只是意味着线程可能仍在运行。线程是根集的一部分,因此即使没有引用它们,它们也会继续运行。如果线程没有停止,您需要通过附加调试器并查看执行停止的位置来找出原因。
【解决方案2】:

"thread.join()" 会挂起执行这句话的线程,直到线程溢出。奇怪的是,如果在 Android UI 线程中执行,Android 不会崩溃。(抱歉我的英语错误)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    相关资源
    最近更新 更多