Handler、MessageQueue、Looper、Message

一个Thread只对应一个Looper
一个Looper产生并管理一个MessageQueue
一个MessageQueue有N个Message
每个Message最多指定一个Handler来处理

1.UI线程已经绑定Looper并开启消息循环

但普通线程没有绑定looper,故在普通线程使用handler时,需要调用Looper.prepare()并Looper.loop()开启消息循环;

1)Looper

Looper的主要作用是产生及管理MessageQueue,Looper是整个消息循环的基础。某个线程调用Looper的prepare方法是,prepare方法内部会产生一个MessageQueue,而且一个线程最多只会有一个Looper实例,同时一个Looper实例也只有一个MessageQueue。主线程使用Handler时不需要调用Looper.prepare(),Looper.loop(),因为主线程的main()方法中已经调用Looper.prepareMainLooper()来产生一个MessageQueue,同时调用了Looper.loop()来进行消息循环。但是在非主线程使用Handler则必须调用这两个方法;
调用Looper的Loop()方法时,loop()方法内部会不断重MessageQueue中取Message,同时调用Handler的dispatchMessage方法吧消息交给Handler处理。

2)Handler

Handler的作用一:把Message发送到MessageQueue中;
作用二:处理MessageQueue中Message(由Looper重MessageQueue中取出Message交给handler处理)
handler不直接处理Message而是将其放进MessageQueue的原因是实现Message的优先级
每个线程可以包含多个Handler,Handler将Message发送到MessageQueue中,是调用的sendMessage方法,其内部又调用enqueueMessage方法将Message加入到MessageQueue中。而enqueueMessage将此Handler赋值给Message的target变量,这也就将Message与Handler绑定在一起了,因为是哪儿Handler发送的Message就由哪个Handler处理,也就是由创建Handler的线程处理。

3)Message

Message代表一个行为(what)或者一串动作(Runnable)

4)Messenger

Messenger可以翻译为信使,可以实现进程间通信(IPC),Messenger采用一个单线程来处理所有的 消息,而且进程间的通信都是通过发送消息来完成的。其底层实现也是aidl,是一个串行实现;

你可能感兴趣的:(Handler、MessageQueue、Looper、Message)