Android线程:屏幕关闭时应用程序挂起

时间:2015-03-15 13:18:09

标签: java android multithreading surfaceview onpause

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

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

我之前已经检查过,并且正确调用了pause / resume方法(使用super.onPause()/ Resume()覆盖Activity的onPause / onResume,然后使用surfaceview.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);
    }

}

暂停方法按照应有的方式进行处理,然后再次启动(另一个“暂停方法启动”)并转到drawABlankScreen(),或者当这个linke被注释时,它会打印“Thread.join()循环“一次,然后应用程序挂起。

这件事最让我感到烦恼的是它挂在我的手机上而它不会挂在我的平板电脑上。 任何人都可以帮助我,我已经搜索了几个小时,什么都没找到....

2 个答案:

答案 0 :(得分:1)

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

相反,你应该杀死线程。

答案 1 :(得分:1)

thread.join()”将挂起执行此句子的线程,直到线程结束。扼杀,如果在Android UI线程中执行,Android就不会崩溃。(抱歉我的错误是英语)。