《Android Handler分析(一) Handler和Message详解》
《Android Handler分析 (二) MessageQueue详解》
《Android Handler分析 (三) Looper详解和Handler其他知识》
《Android 中的 HandlerThread 类详解》
在《Android Handler机制》中我们对Handler机制的整体流程做了分析,知道了在Android中是怎样通过Handler进行线程切换的了。接下来,我们就看看Handler中的相关类分析。
Message源码分析:
前面说到了Message表示一个消息,可以理解为线程间通讯的数据单元,可以用来传递一些数据。
1. 首先看一下Message类中的一些成员变量
public int what:可以用来区分不同的消息,然后在Handler中做不同的处理
public int arg1,arg2:可以传递数据,当需要传递的数据仅仅是int类型时,可以用arg1和arg2,而不需要使用复杂的obj和data
public Object obj:可以传递数据,可以传递任意的Object对象
Bundle data:可以Bundle类型传递数据,但是使用了默认修饰符,不能直接使用Message对象.data的形式设置和获取值,但Message提供了对应的get和set方法用来设置和获取值
Handler target:保存发送消息的Handler对象,可以在创建Message时指定,在后面会有用到target这个参数,所以特别说明
Runnable callback:Runable对象,可以在创建Message时指定,另外在Handler使用post形式发送消息时的callback参数最终也是保存在 Message的这个参数中
Message next:Message对象,用来使Message组成链表的形式
private static Message sPool:用于保存回收的Message消息对象
private static boolean gCheckRecycle = true:判断Android版本是否大于Android5.0(Build.VERSION_CODES.LOLLIPOP),小于为false
2. 创建(获取)一个Message对象(以下方法都是使用Public修饰的)
Message(){} // 空参数构造方法,直接new Message()创建对象
static Message obtain() // 使用静态的obtain()方法获取,内部会重复使用回收的Message对象,比较常用static Message obtain(Message orig) // 根据传递的Message对象复制一个新的Message对象
static Message obtain(Handler h) // 给Message指定Handler,会将 h 赋值给 成员变量 target
static Message obtain(Handler h, Runnable callback) // 给Message指定Handler和Runable,会将 h 赋值给 成员变量 target,callback赋值给Message的成员变量 callbac