android中的多线程:消息传递

时间:2012-11-02 09:33:54

标签: java android multithreading concurrency android-handler

Android Handler是并发message passing的实现吗?

似乎通过使用HandlerThread,可以轻松地在多个工作线程之间进行通信。但是,据我所知,并发中的消息传递基于使用共享内存。我试图了解Handler的实现机制,但对我来说仍然不太清楚。

Android Handler如何以简单的方式运作?

3 个答案:

答案 0 :(得分:2)

是的,Handler提供了一种线程间消息传递的形式。 Handler对象本身是可以从多个线程访问的“共享内存”,但它是线程安全的,并为您管理详细信息。

更具体地说,Handler是用于与给定线程的message queueMessageQueue)进行交互的便捷工具。当您将RunnableMessage发布到Handler时,会将MessageQueue添加到Handler的帖子中。就线程而言,它运行event loopLooper),持续处理线程队列中的消息。

如果您想了解Android实施的详细信息,可以查看Handler.java(在Android 4.1.1中)的代码on GrepCode。该类的文档非常详细,代码也很平易近人。

答案 1 :(得分:1)

简答:是的

答案很长:@acj答案是对Handler / Looper / MessageQueue具体内容的简短简明解释。但是,它确实错过了几点。

每个线程都可以有关联的消息队列,其中存储发送给它的消息,直到线程执行它们。消息在线程上运行的循环中按顺序处理。其他线程可以将消息发布到队列中;但是,消息处理是异步的,其他线程通常不会阻塞它。

有许多标准化消息(如Runnable消息)由循环的OS实现执行。但是,应用程序代码也可能支持处理自定义消息。

Handler只是将消息从其他线程发布到特定线程(通常是创建Handler对象的线程)的消息队列的一种方便方法。请注意,Handler只能在进程中使用,并且在单个进程中所有内存在所有线程中都是通用的,因此消息队列不需要保存在“共享内存”中(该术语用于内存)通常可以通过多个过程访问的区域。

要记住这一切的一个具体问题是使用Handler发布消息并不能保证它的处理。线程可能会在收到您的消息之前因任何原因退出。

答案 2 :(得分:0)

如您所知,您只能在UI线程中对UI进行更改。因此,当您需要在后台执行某些操作并在UI中显示结果但由于某种原因您不想使用AsyncTasks(例如,您需要一次运行多个任务)时,您可以使用Handler。它可以从非UI线程接收消息,并且由于这些消息对UI进行了更改(当然在UI线程中)。

例如,我们在OnCreate()方法中实现处理程序:

TextView tvInfo = (TextView) findViewById(R.id.tvInfo);
Handler h = new Handler() {
  public void handleMessage(android.os.Message msg) {
    tvInfo.setText("received: " + msg.what);
  };
}; 

并实现一些线程,它会将消息发送到其他地方的处理程序(例如onClickListener):

Thread t = new Thread(new Runnable() {
    public void run() {
      for (int i = 1; i <= 10; i++) {
        // some long action
        downloadFile();
        h.sendEmptyMessage("downloading of file " + i + " complete");
      }
    }
});
t.start();