在长时间运行的线程的示例中,如何将消息(不是可运行的)传递给UI线程?
基本上,如果我这样做:
Looper.getMainLooper().sendMessage(myMessage);
如何在主Activity线程中收到此消息作为事件?我知道我可以在Thread创建时直接传递一个不同的处理程序但是如果Activity被销毁了它就不行了吗?
我知道像Async Task,Retain Fragment和Singletons这样的解决方法,但这仅仅是为了理解。
答案 0 :(得分:1)
您需要创建与主Looper关联的Handler,并使用该Handler发送消息。像这样:(警告:伪代码,可能无法编译)
Handler myHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MY_MESSAGE_TYPE:
//do something with the message
break;
}
}
}
Message myMessage = myHandler.obtainMessage(MY_MESSAGE_TYPE, somePayloadObject);
myHandler.sendMessage(myMessage);
发送消息的处理程序也将“处理”它。
注意:如果在主线程上创建Handler,则可以使用空构造函数。默认情况下,它会附加到当前的Looper线程。
此外,如果您不想按照声明将此绑定到活动生命周期,则可以启动服务来处理消息,或者如果消息具有瞬态特性,则可能使用应用程序单例。