Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android从长时间运行的线程接收消息_Java_Android_Multithreading_Event Handling - Fatal编程技术网

Java Android从长时间运行的线程接收消息

Java Android从长时间运行的线程接收消息,java,android,multithreading,event-handling,Java,Android,Multithreading,Event Handling,在长时间运行的线程示例中,如何将消息(不是可运行的)传递给UI线程 基本上如果我这样做: Looper.getMainLooper().sendMessage(myMessage); 我如何在我的主活动线程中作为事件接收此消息?我知道我可以在创建线程时直接传递另一个处理程序,但是如果活动被破坏,它就会消失,不是吗 我知道类似异步任务、保留片段和单例的解决方法,但这仅仅是为了理解。您需要创建一个与主循环器关联的处理程序,并使用该处理程序发送消息。类似以下内容:(警告:伪代码,可能无法编译) 发送

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

基本上如果我这样做:

Looper.getMainLooper().sendMessage(myMessage);
我如何在我的主活动线程中作为事件接收此消息?我知道我可以在创建线程时直接传递另一个处理程序,但是如果活动被破坏,它就会消失,不是吗


我知道类似异步任务、保留片段和单例的解决方法,但这仅仅是为了理解。

您需要创建一个与主循环器关联的处理程序,并使用该处理程序发送消息。类似以下内容:(警告:伪代码,可能无法编译)


发送消息的处理程序也将“处理”消息

注意:如果在主线程上创建处理程序,则可以使用空构造函数。默认情况下,它附加到当前活套线程


另外,如果您不想像您所说的那样将其与活动生命周期联系在一起,您可以启动一个服务来处理消息,或者如果消息具有暂时性,则可能使用应用程序单例。

“发送消息的处理程序也将“处理”消息。”这让我有点困惑。我必须在线程和活动中使用相同的处理程序引用?我不确定你在问什么,一个具体的例子会有所帮助。但是,当您
sendMessage(…)
时,将在消息上设置对处理程序的引用,并且当循环器运行消息时,它将(最终)在该处理程序实例上调用
handleMessage(…)
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);