【问题标题】:Android Recieve message from long running threadAndroid从长时间运行的线程接收消息
【发布时间】:2014-07-30 17:45:35
【问题描述】:

在一个长时间运行的线程示例中,如何将消息(不是可运行的)传递给 UI 线程?

基本上,如果我这样做:

Looper.getMainLooper().sendMessage(myMessage);

如何在我的主 Activity 线程中作为事件接收此消息?我知道我可以在创建线程时直接传递不同的处理程序,但是如果 Activity 被销毁,它就消失了,不是吗?

我知道诸如 Async Task、Retain Fragment 和 Singletons 之类的变通方法,但这只是为了理解。

【问题讨论】:

    标签: java android multithreading event-handling


    【解决方案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 线程。

    此外,如果您不想将其与您所说的 Activity 生命周期联系起来,您可以启动一个服务来处理消息,或者如果消息具有瞬态特性,则可能使用应用程序单例。

    【讨论】:

    • "发送消息的处理程序也将'处理'它。"这让我有点困惑。我必须在线程和活动中有相同的处理程序引用?
    • 我不确定你在问什么,一个具体的例子会有所帮助。但是,当您 sendMessage(...) 时,将在 Message 上设置对 Handler 的引用,并且当 Looper 运行消息时,它(最终)在该 Handler 实例上调用 handleMessage(...)
    猜你喜欢
    • 1970-01-01
    • 2021-12-02
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 2015-03-07
    • 1970-01-01
    相关资源
    最近更新 更多