我有一个简单的问题:如果以前退出,是否可以重新启动(重新循环())线程的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()来实现这个吗?
答案 0 :(得分:2)
首先让我解释一下为什么你的示例代码不起作用。 Looper只处理一个MessageQueue,而且只处理一个MessageQueue。调用Looper.prepare()时会创建此MessageQueue,并在调用Looper.loop()时处理消息。一旦你调用了Looper.quit(),就会发生两件事:
因此,(1)是RuntimeException的原因,(2)允许您尝试并使用Looper.loop()重新启动消息检索,但只从MessageQueue返回“null” - 对象。
其次,让我建议一种更好的方法来解决UI和工作线程之间的持续通信:
现在,让两个处理程序通过来回发送消息进行通信。将消息发布到mWorkerHandler以获取后台任务,并且只要显示或删除对话框,工作线程就会将消息发布到mUiHandler。
答案 1 :(得分:0)
我认为你应该阅读这篇简短的文章http://mindtherobot.com/blog/159/android-guts-intro-to-loopers-and-handlers/。它解释了Looper的工作原理以及如何使用它。