我想在应用程序进入后台时暂停线程,并在应用程序进入前台时恢复线程。但是返回到前台后线程正在运行但 UI 不会对输入使用react,并且在一段时间后 Activity 崩溃并且没有错误消息并且应用程序重新启动到主 Activity 。线程运行时不会调用 onResume()。
这是我得到的:
在 Activity 中:
@Override
public void onPause() {
super.onPause();
if (running) {
canvas.getEngine().onPause();
}
}
@Override
public void onResume() {
super.onResume();
if (running) {
canvas.getEngine().onResume();
}
}
Canvas 扩展表面 View :
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
if (!engine.isRunning()) {
engine.setRunning(true);
engine.start();
}
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
boolean retry = true;
while (retry) {
try {
engine.join();
retry = false;
}
catch (InterruptedException e) {
}
}
}
引擎扩展线程:
private boolean mPaused;
private Object mPauseLock;
@Override
public void run() {
//bla bla
synchronized (mPauseLock) {
while (mPaused) {
try {
mPauseLock.wait();
} catch (InterruptedException e) {
}
}
}
}
public void onPause() {
synchronized (mPauseLock) {
mPaused = true;
}
}
/**
* Call this on resume.
*/
public void onResume() {
synchronized (mPauseLock) {
mPaused = false;
mPauseLock.notifyAll();
}
}
最佳答案
synchronized (mPauseLock)
锁定 mPauseLock
synchronized (mPauseLock) {
while (mPaused) {
try {
mPauseLock.wait();
} catch (InterruptedException e) {
}
}
}
}
调用 resume 时,下面的代码被锁定,更糟糕的是,它锁定了主线程。
synchronized (mPauseLock) {
mPaused = false;
mPauseLock.notifyAll();
}
所以你只需要删除 run();
关于android - 当应用程序进入后台时暂停线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28450684/