Android Handler是并发message passing的实现吗?
似乎通过使用HandlerThread
,可以轻松地在多个工作线程之间进行通信。但是,据我所知,并发中的消息传递基于使用共享内存。我试图了解Handler的实现机制,但对我来说仍然不太清楚。
Android Handler
如何以简单的方式运作?
答案 0 :(得分:2)
是的,Handler
提供了一种线程间消息传递的形式。 Handler
对象本身是可以从多个线程访问的“共享内存”,但它是线程安全的,并为您管理详细信息。
更具体地说,Handler
是用于与给定线程的message queue(MessageQueue
)进行交互的便捷工具。当您将Runnable
或Message
发布到Handler
时,会将MessageQueue
添加到Handler
的帖子中。就线程而言,它运行event loop(Looper
),持续处理线程队列中的消息。
如果您想了解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();