深入解析Handler消息机制(源码解析)

目录

一、Message

1. 一些属性和方法

 2. 创建和回收Message对象的基本方法

 3. 其他属性和方法

二、MessageQueue

三、Looper

 1. 创建和退出Looper

2.  运行Looper处理消息

四、Handler

 1.初始化

 2. 发送消息

 3. 接收消息

 4. 内存泄露


一、Message

1. 一些属性和方法

waht:int //消息标识,用于区分不同消息
arg1:int //如果要传递的消息只有少量的integer型数据
arg2:int
obj:Object //开发者可自定义类型的传输数据
data:Bundle
getData():Bundle //得到Bundle数据,如果data是空放入话就new一个
peekData():Bundle //得到Bundle数据,如果data是空就返回null
setData(Bundle data):void // 设置Bundle数据

 2. 创建和回收Message对象的基本方法

Message() //构造函数
flags:int // 用于标识当前对象是否存在于缓存池,0代表不在缓存池中
FLAG_IN_USE=1<<0 //供flag使用, in use(正在使用),如果Message对象被存入MessageQueue消息队列排队等待Looper处理,或者被回收到缓存池中等待重复利用时,那么他就是in use状态
sPoolSync:Object=new Object() //静态常量对象,通过synchronized(sPoolSyn)让它作为线程并发操作时的锁,确保同一时刻只有一个线程可以访问当前对象的引用
sPool:Message //当前链表缓存池的入口,装载着缓存池中第一个可用的对象
next:Message //链表缓存池中指向下一个对象引用的next指针
sPool:int=0 // 当前链表缓存池中对象的数量
obtain():Message //从缓存池中拿出一个Message对象,可以让我们在许多情况下避免分配新对象

 回收Message对象到缓存池的方法:

MAX_POOL_SIZE:int =50 //缓存池最大存储值
gCheckRecycle:boolean //区分当前Android版本是否>=LOLLIPOP版本的全局静态变量,默认初始值为true
updateCheckRecycle(int):void //用于区分版本是否>=LOLLIPOP版本内部隐藏方法,开发者不可见
isInUse():boolean //判断当前对象的flags是否为in use状态
recycle():void //将对象回收入缓存池中,不能回收一个在MessageQueue排队等待处理或者正在交付给Handler处理的Message对象
recycleUnchecked():void //回收一个可能是in use的状态的Message对象,在MessageQueue和Looper内部处理排队Meaage时也会调用此方法
obtain(Handle):Message //每个线程只有一个looper和MessageQueue,利用Handle判断当前这个message是哪个handle
setTarget():void
getrart():void
callback:Runnable //在looper分发消息时如果Runnable callback不是空的,就不调用Handle的handleMessage(Message)
obtain(Handle,Runnable):Message //包含Runnable参数的obtain()
getCallback():Runnable

 3. 其他属性和方法

when:long //存储当前Message应该被处理的时间
getWhen():long
CREATOR:Create<Message>=new Creator<Message>(){} //实例化Parcelable.Creator接口,完成parcel接口,完成Paarcle对象转Message对象的操作
describeContents():int // 序列化对象时的特殊类对象的描述,默认0
writeToParcel(Parcel,int) //将Meaage对象的属性写入
FLAG_ANDY:int=1<<1 //该常量代表异步传输方式
isAsynchronous():int //判断是否为异步传输
setAsynchronous(boolean):void //设置当前对象是否为异步传输

二、MessageQueue

//native方法:
nativeInit():long //初始化
nativeDestroy(long):void //注销
nativePollOnce(long,int)void //让线程阻塞timeoutMillis毫秒
nativeWake(long):void //立刻唤醒线程
nativeIsPolling(long):b
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值