2

Android Handler是并发消息传递的实现吗?

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

Handler简而言之,Android 是如何工作的?

4

3 回答 3

2

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

更具体地说,a是与给定线程的消息队列( )Handler交互的便捷工具。当您将 a或发布到 a时,它们将被添加到for the的线程中。就线程本身而言,它运行一个事件循环( ),持续处理线程队列中的消息。MessageQueueRunnableMessageHandlerMessageQueueHandlerLooper

如果您想了解 Android 实现的细节,Handler.java可以在 GrepCode上查看(Android 4.1.1 中)的代码。该类的文档非常详细,并且代码平易近人。

于 2012-11-03T02:55:39.310 回答
1

简短的回答:是的

长答案:@acj 答案是对Handler/ Looper/细节的简短而简洁的解释MessageQueue。但是,它确实错过了几点。

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

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

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

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

于 2012-11-03T03:38:23.410 回答
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();
于 2012-11-02T09:46:55.463 回答