我有一个HandlerThread,我每隔5秒就会继续发布一个runnable。像这样:
HandlerThread thread = new HandlerThread("MyThread");
thread.start();
Handler handler = new Handler(thread.getLooper());
handler.post(new Runnable() {
public void run() {
//...
handler.postDelayed(this, 5000);
}
});
我需要在60秒或类似之后退出弯针......所以我写道:
mainHandler = new Handler(Looper.myLooper()); //main thread's
mainHandler.postDelayed(new Runnable() {
@Override
public void run() {
thread.getLooper().quit();
}
}, 60000);
我认为这会导致looper突然退出,所以我开始收到这条“警告”消息:
W / MessageQueue(3726):java.lang.RuntimeException:Handler (android.os.Handler){4823dbf8}向死亡处理程序发送消息 螺纹
我想避免这个错误消息,我认为我可以使用Looper.quitSafely()
方法解决它..但是我检查了API它已经不再可用了。
有谁知道发生了什么事? (它不像其他方法那样已弃用。)
有什么方法可以安全地退出弯针吗?谢谢!
答案 0 :(得分:1)
您可以尝试使用布尔值来了解代码是否应该执行。像这样:
private boolean runHandler = true;
...
HandlerThread thread = new HandlerThread("MyThread");
thread.start();
Handler handler = new Handler(thread.getLooper());
handler.post(new Runnable() {
public void run() {
if(runHandler){
//...
handler.postDelayed(this, 5000);
}
}
});
mainHandler = new Handler(Looper.myLooper()); //main thread's
mainHandler.postDelayed(new Runnable() {
@Override
public void run() {
runHandler = false;
}
}, 60000);
答案 1 :(得分:0)
我不是线索大师,但这种方式可以给你指路:
...
_thread.setRunning(true);
_thread.start();
..
public void stopThread(){
boolean retry = true;
_thread.setRunning(false);
while (retry) {
try {
_thread.join();
retry = false;
Log.e("test", "thread stopped");
} catch (InterruptedException e) {
Log.e("test", "can't stop thread, retrying...");
// we will try it again and again...
}
}
}
在你的主题中:
while (isRunning) {
//...
}
首先在循环中实现run
方法(while(isRunnig){}
)。
完成后,您将标记切换为false并“等待”join
。