0

我有一个简单的问题:如果 (re-loop()) 线程的 Looper 之前退出,是否可以重新启动它。例如,我设计了我的线程如下:

public class ProvaThread extends Thread implements Runnable{

        public void run(){

            Looper.prepare();
            Handler handler = new Handler(){
                Log.d(TAG, "handle message..");
                @Override
                public void handleMessage(Message msg){

                    getLooper().quit();
                }
            };

            Looper.loop(); //loop 1

            Log.d(TAG, "thread continue (1)...");

            Looper.loop(); //loop 2

            Log.d(TAG, "thread continue (2)...");

        }
    }

我已经尝试过这段代码,但是当我第二次尝试向处理程序发布消息(第二次之后不调用)时,我得到了一个RuntimeException向死线程上的处理程序发送消息)。我得出的结论是,何时调用是否可以召回但无法处理新消息,否则会引发异常)。这是对的吗?handleMessage()loop()getLooper().quit()loop()

我应该使用 wait()/notify() 来做这个吗?

4

2 回答 2

3

让我先解释一下为什么您的示例代码不起作用。Looper 只处理一个,也只有一个,MessageQueue。当您调用 Looper.prepare() 时会创建此 MessageQueue,并在您调用 Looper.loop() 时处理消息。一旦你调用了 Looper.quit() ,就会发生两件事:

  1. Looper 的 MessageQueue 处于最终终端状态,不会处理任何传入的消息;抛出 RuntimeException。
  2. 当 Looper 尝试检索消息时,它只会返回“null”作为消息。

因此,(1) 是 RuntimeException 的原因,(2) 允许您尝试使用 Looper.loop() 重新启动消息检索,但仅从 MessageQueue 返回“null”对象。

其次,让我建议一种更好的方法来解决 UI 和工作线程之间的持续通信:

  1. 为 UI 线程创建一个 Handler,称为 mUiHandler。
  2. 创建一个工作线程,例如HandlerThread,并暴露一个Handler,称为mWorkerHandler。

现在,让两个处理程序通过来回发送消息进行通信。为后台任务向 mWorkerHandler 发布消息,并让工作线程在显示或删除对话框时向 mUiHandler 发布消息。

于 2013-01-26T22:06:06.650 回答
0

我认为您应该阅读这篇短文http://mindtherobot.com/blog/159/android-guts-intro-to-loopers-and-handlers/。它解释了 Looper 的工作原理以及如何使用它。

于 2013-01-24T22:22:39.577 回答