Android第十一天 Handler
Handler
一、引入Handler 消息传递机制
1、案例: 网络访问结果直接显示到UI页面中
结论: 出现异常问题
CalledFromWrongThreadException
Message
分析: 引入UI线程与工作线程 MainThread 与WorkThread
主线程不能访问网络, 子线程不能更新UI
2、Handler的基本使用
A、流程
1.定义Handler类
2.重写handleMessage方法
3.使用Message包装对象
4.handler send Message
5.handleMessage方法接收并处理
B、细节
1.Message 获取三种方式
new Message —
Message.Obtain(); — 在消息池中获取空消息使用,节省资源
handler.ObtainMessage();-- 与上面的一
2.Message 的方法
arg1 用来存放int型数据
arg2 用来存放int型数据
object 用来存放Object对象
what 用来标记,用户自定义标记 根据消息代码不同而执行不同的响应操作
需要注意的地方
1.构造 使用节省资源的方式
2.int型数据优先使用arg 节省资源
3.使用MessageWhat标记
4.将大数据集合为Bundle对象 传递
3.handler的发送方式
1. handler .sendEmptyMessage(what )
2.handler.sendEmptyMessageAtTime()
3.handler.sendEmptyMessageDelayed()
4.handler.sendMessage();
5.handler.sendMessageAtTime();
6.handler.sendMessageDelayed();
4.接收 handleMessage
二、原理分析
1.介绍四个类所有的方法
Handler
属性:MessageQueue -- handler讲消息发送出去实际就是放在这里
Looper--每个handler有一个looper为其不断的接受消息队列消息
CallBack--回调接收 方法handleMessage
方法:
handleMessage : 回调接口中的方法
obtainMessage:获取消息实例 本质还是调用Message.Obtain
sendMessage:
sendMessageDelayed:
sendMessageAtTime:
sendEmptyMessage:
sendEmptyMessageDelayed:
sendEmptyMessageAtTime:y
post:
postDelayed:
postAiTime:
enqueueMessage:将消息压入到MessageQueue中
dispatchMessage:当looper不断的获取到消息后调用该方法分发消息触发CallBack里的handleMessage方法进行消息处理
Looper
属性:
ThreadLocal<Looper>: 本地线程变量 由于该变量保证每个线程只有一个Looper也就是说一个线程只能有一个Looper
方法:
prepare:所有的Handler 所在线程都必须有一个looper 准备好
prepareMainLooper:获取主线程中的looper对象
myLooper:从线程本地变量中获取当前线程的Looper对象
loop:循环接收消息队列中的消息
Message
属性:
what: 标记消息
arg1: 存放消息的 int
arg2: 存放消息的 int
obj: 用来存放消息的Object
data:用来存放消息属性Bundle
target:标示 Handler
sPool:消息池中的每个消息对象
sPoolSize:纪录消息池中剩余消息的数量
MAX_POOL_SIZE:消息池中的最大消息对象数量
replyTo: Messenger:自定义信使对象 跨进程
方法:
obtain: 获取Message实例
setTarget: 设置收到消息的Handler
getTarget: 获取应该收到消息的Handler
setData: 设置Bunldle对象
getData: 设置Bunldle对象
sendToTarget: 将消息发送到目标Handler对象,本质还是调用sendMessage
recycle: 往消息池中归还消息对象
MessageQueue
属性:
enqueueMessage:通过改方法将消息添加到自己的队列中
next:下一个Message
3.源码分析
图片: