【问题标题】:multithreading in android : message passingandroid中的多线程:消息传递
【发布时间】:2012-11-02 09:33:53
【问题描述】:

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

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

简单来说AndroidHandler是如何工作的?

【问题讨论】:

标签: java android multithreading concurrency android-handler


【解决方案1】:

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

更具体地说,Handler 是与给定线程的message queue (MessageQueue) 交互的便捷工具。当您将RunnableMessage 发布到Handler 时,它们将被添加到MessageQueueHandler 线程中。线程本身运行一个event loop (Looper),持续处理线程队列中的消息。

如果您想了解Android实现的细节,可以查看Handler.java(Android 4.1.1)的代码on GrepCode。该类的文档非常详细,代码也很容易上手。

【讨论】:

    【解决方案2】:

    简短回答:是的

    长答案:@acj 答案是对Handler / Looper / MessageQueue 细节的一个很好的简短说明。但是,它确实错过了几点。

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

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

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

    所有这一切都需要牢记的一个具体事项是,使用Handler 发布消息并不能保证它正在处理。线程在收到您的消息之前可能出于多种原因退出。

    【讨论】:

      【解决方案3】:

      如您所知,您只能在 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();
      

      【讨论】:

      • 我的问题更加全球化,它是关于多线程中的消息传递,而不是关于如何在 Android 中使用 Handler,抱歉 :)
      猜你喜欢
      • 1970-01-01
      • 2012-08-02
      • 2012-01-07
      • 2021-07-08
      • 2021-03-27
      • 2015-08-01
      • 1970-01-01
      • 2013-12-17
      • 1970-01-01
      相关资源
      最近更新 更多