我有一个运行到活动的线程。当用户点击主页按钮时,不希望线程连续运行,或者例如,用户接收到呼叫电话。 所以我想暂停线程并在用户重新打开应用程序时恢复它。 我试过这个:
protected void onPause() {
synchronized (thread) {
try {
thread.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
super.onPause();
}
protected void onResume() {
thread.notify();
super.onResume();
}
它会停止线程,但不恢复它,线程似乎已冻结。
我也尝试使用已弃用的方法Thread.suspend()
和Thread.resume()
,但在这种情况下,Activity.onPause()
线程不会停止。
任何人都知道解决方案吗?
答案 0 :(得分:63)
使用锁定正确使用wait()
和notifyAll()
。
示例代码:
class YourRunnable implements Runnable {
private Object mPauseLock;
private boolean mPaused;
private boolean mFinished;
public YourRunnable() {
mPauseLock = new Object();
mPaused = false;
mFinished = false;
}
public void run() {
while (!mFinished) {
// Do stuff.
synchronized (mPauseLock) {
while (mPaused) {
try {
mPauseLock.wait();
} catch (InterruptedException e) {
}
}
}
}
}
/**
* Call this on pause.
*/
public void onPause() {
synchronized (mPauseLock) {
mPaused = true;
}
}
/**
* Call this on resume.
*/
public void onResume() {
synchronized (mPauseLock) {
mPaused = false;
mPauseLock.notifyAll();
}
}
}
答案 1 :(得分:4)
尝试下面的代码
Thread thread=null;
的onResume()
public void onResume(){
super.onResume();
if(thread == null){
thread = new Thread()
{
@Override
public void run() {
try {
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
thread.start();
}
}
的onPause()
@Override
public void onPause(){
super.onPause();
if(thread != null){
Thread moribund = thread;
thread = null;
moribund.interrupt();
}
}