Android:是否有可能重新启动Thread的Looper?

时间:2013-01-24 21:57:21

标签: android multithreading looper

我有一个简单的问题:如果以前退出,是否可以重新启动(重新循环())线程的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()后没有调用{1}}。我得出结论,当loop()被调用时,可以回忆getLooper().quit(),但是不可能处理新消息,否则抛出异常)。这是对的吗?

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

2 个答案:

答案 0 :(得分:2)

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

  1. Looper的MessageQueue处于最终终端状态,它不会处理任何传入消息;抛出RuntimeException。
  2. 当Looper尝试检索消息时,它只会返回“null”作为消息。
  3. 因此,(1)是RuntimeException的原因,(2)允许您尝试并使用Looper.loop()重新启动消息检索,但只从MessageQueue返回“null” - 对象。

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

    1. 为UI线程创建一个名为mUiHandler的处理程序。
    2. 创建一个工作线程,例如HandlerThread,并公开一个名为mWorkerHandler的Handler。
    3. 现在,让两个处理程序通过来回发送消息进行通信。将消息发布到mWorkerHandler以获取后台任务,并且只要显示或删除对话框,工作线程就会将消息发布到mUiHandler。

答案 1 :(得分:0)

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