似乎通过使用HandlerThread
,可以很容易地在多个工作线程之间进行通信。但是,据我了解,并发消息传递是基于使用共享内存。我试图了解Handler的实现机制,但对我来说仍然不清楚。
Handler
简而言之,Android 是如何工作的?
似乎通过使用HandlerThread
,可以很容易地在多个工作线程之间进行通信。但是,据我了解,并发消息传递是基于使用共享内存。我试图了解Handler的实现机制,但对我来说仍然不清楚。
Handler
简而言之,Android 是如何工作的?
是的,aHandler
提供了一种线程间消息传递的形式。Handler
对象本身是可从多个线程访问的“共享内存”,但它是线程安全的并为您管理细节。
更具体地说,a是与给定线程的消息队列( )Handler
交互的便捷工具。当您将 a或发布到 a时,它们将被添加到for the的线程中。就线程本身而言,它运行一个事件循环( ),持续处理线程队列中的消息。MessageQueue
Runnable
Message
Handler
MessageQueue
Handler
Looper
如果您想了解 Android 实现的细节,Handler.java
可以在 GrepCode上查看(Android 4.1.1 中)的代码。该类的文档非常详细,并且代码平易近人。
简短的回答:是的
长答案:@acj 答案是对Handler
/ Looper
/细节的简短而简洁的解释MessageQueue
。但是,它确实错过了几点。
每个线程都可以有关联的消息队列,发送给它的消息被存储在其中,直到线程开始执行它们。消息在线程上运行的循环中按顺序处理。其他线程可以将消息发布到队列中;但是,消息处理是异步的,其他线程通常不会阻塞它。
有许多标准化消息(如Runnable
消息)由循环的操作系统实现执行。但是,应用程序代码也可能支持处理自定义消息。
Handler
只是将消息Handler
从其他线程发布到特定线程(通常是创建对象的线程)的消息队列的便捷方式。请注意,Handler
只能在进程内使用,并且在单个进程中,所有内存在所有线程中都是通用的,因此消息队列不需要保存在“共享内存”中(该术语用于多个进程可访问的内存区域通常)。
所有这一切要记住的一件具体事情是,使用 a 发布消息Handler
并不能保证它正在处理。线程在收到您的消息之前可能出于多种原因退出。
如您所知,您只能在 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();