【问题标题】:Message sent to the UI thread never arrives发送到 UI 线程的消息永远不会到达
【发布时间】: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,

我在这里错过了什么?

【问题讨论】:

    标签: java android multithreading


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 2015-07-24
    • 2020-11-14
    • 2019-02-22
    • 2019-08-14
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多