如何安全地退出HandlerThread looper

时间:2013-07-30 07:59:36

标签: android handlers looper

我有一个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它已经不再可用了。 有谁知道发生了什么事? (它不像其他方法那样已弃用。)

有什么方法可以安全地退出弯针吗?谢谢!

2 个答案:

答案 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