发送到 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 线程的消息永远不会到达的主要内容,如果未能解决你的问题,请参考以下文章

Twisted irc python bot - 缓冲消息

在 UI 线程中删除已发送的消息

Android:子线程向UI主线程发送消息

UI 测试 + postNotificationName + 永远不会到达观察者 + Xcode 7

Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)(子线程 与 子线程之间)

PyQt跨线程发出信号