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 不会崩溃。(对不起,我的英语错误很多)。
我在线程上运行的 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 不会崩溃。(对不起,我的英语错误很多)。