Android 主题:应用程序在屏幕关闭时挂起

Android Thread: App hangs when screen turns off

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

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

我之前检查过 pause/resume 方法被正确调用(使用 super.onPause()/Resume() 覆盖 Activity 的 onPause/onResume 然后surfaceview.pause()/恢复())

我的pause/resume方法:

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 method start")并转到 drawABlankScreen(),或者当此链接被注释时,它打印 "Thread.join() loop" 一次然后应用程序挂起。

最让我烦恼的是它挂在我的 phone 而没有挂在我的平板电脑上。 任何人都可以帮助我,我已经搜索了几个小时但一无所获....

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

相反,您应该终止线程。

"thread.join()"会挂起执行这句话的线程,直到线程运行结束。奇怪的是,如果在 Android UI 线程中执行, Android 不会崩溃。(对不起,我的英语错误很多)。