发送到 UI 线程的消息永远不会到达
Posted
技术标签:
【中文标题】发送到 UI 线程的消息永远不会到达【英文标题】:Message sent to the UI thread never arrives 【发布时间】:2018-02-01 21:49:57 【问题描述】:到目前为止,这个话题已经讨论过很多次了,但仍然没有成功。
我的MainActivity
有一个名为Handler mHandlerUi;
的属性,它在其构造函数中初始化
mHandlerUi = new Handler()
@Override
public void handleMessage(Message msg)
onMessageArrive(msg);
;
稍后在代码中,在另一个类中,在构建期间我初始化另一个 Handler 属性
mHandlerToUi = new Handler(Looper.getMainLooper());
所以在线程的生命周期内,下面的代码 sn-p 会被执行 X 次。
Message msg = mHandlerToUi.obtainMessage();
msg.what = ConstMessages.MSG_NEW_GPS_POINT;
msg.setData(bundleContet);
mHandlerToUi.sendMessage(msg);
不幸的是消息永远不会到达 MainActivity 的 Looper,两个线程都使用同一个 UI 的 Looper,
我在这里错过了什么?
【问题讨论】:
【参考方案1】:如果我理解正确,您已经启动了两个处理程序,并且您想将消息从一个传递到另一个?
也许您应该将处理程序传递给第二个类。所以在你的MainActivity
你有
mHandler = new Handler(Looper.getMainLooper())
@Override
public void handleMessage(Message inputMessage)
onMessageArrive(msg);
并通过构造函数或 setter 方法将此 mHandler
传递给您的第二个类。
【讨论】:
这正是我想要做的,但我为什么需要在类之间共享 Handler 的引用,而不是它的 looper?有没有办法达到相同的效果是如果我会使用 DuplicateHandle(c 语言) Kevinrob 已经回答了您的问题,是什么阻止您传递处理程序引用?【参考方案2】:每个Handler
处理它的消息。 Looper
用于在特定的 Thread
上运行 Handler
。
如果你创建了两个Handler
,就不会通信了。只会共享在Thread
上运行的相同Looper
。
你可以在What is the relationship between Looper, Handler and MessageQueue in android?找到好的答案
【讨论】:
那么Looper只是其他实例之间的队列管理,而通信本身是由Handler完成的? @igalk 阅读 this以上是关于发送到 UI 线程的消息永远不会到达的主要内容,如果未能解决你的问题,请参考以下文章
UI 测试 + postNotificationName + 永远不会到达观察者 + Xcode 7