7

我有一个 HandlerThread,我每 5 秒就向它发布一个可运行的线程。像这样的东西:

HandlerThread thread = new HandlerThread("MyThread");
thread.start();
Handler handler = new Handler(thread.getLooper());
handler.post(new Runnable() {
  public void run() { 
    //...
    handler.postDelayed(this, 5000);
  }
});

我需要在某个时候退出 looper,在 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} 在死线程上向 Handler 发送消息

我想避免这个错误消息,我认为我可以通过使用该Looper.quitSafely()方法来解决它。但我检查了API,它不再可用。有谁知道发生了什么?(它不像其他一些方法那样被弃用)。

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

4

2 回答 2

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);
于 2013-07-30T08:17:03.337 回答
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){})中实现方法。

完成后,您将 flag 切换为 false 并“等待” join.

于 2013-07-30T08:15:03.687 回答