在一个长时间运行的线程的例子中,我如何传递一个消息(不是可运行的)到UI线程?
基本上如果我这样做:
Looper.getMainLooper().sendMessage(myMessage);
我如何接收这个消息在我的主活动线程作为一个事件?我知道我可以直接通过线程创建不同的处理程序,但如果活动被销毁,它已经消失了,不是吗?
我知道像异步任务,保留片段和单例的解决方案,但这仅仅是为了理解。
您需要创建一个与主loop关联的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也将'处理'它。
注意:如果你在主线程上创建Handler,你可以使用空构造函数。默认情况下,它附加到当前的loop线程。
同样,如果你不想像你所说的那样将其绑定到Activity生命周期,你可以启动一个Service来处理消息,或者如果消息具有瞬态性质,则可能使用应用程序单例。