Handler
一, 回顾异步任务
AsyncTask
二, android 使用线程的规则
1,在主线程 不能做阻塞操作
2,在主线程之外的线程不能更新Ui
三, Handler的作用
1,在子线程中发送消息
2,在Ui线程获取消息和处理消息
note:Handler是 消息的发送者和消息的处理者
四: Message
Message 是线程之间消息的载体 包括对消息的描述 和任意数据的处理
Message 主要携带俩个int类型数据 和Object类型数据 还有个标记 what
五, Handler的消息处理机制
1,Handler 在工作线程发送消息和主线程接收和处理消息
对象:
final MessageQueue mQueue;封装好的Message对象 通过Handler发送到MessageQueue
final Looper mLooper;循环读取消息队列里的消息
方法:
handleMessage();处理Handler返回的消息(从Looper)
************************************************
sendMessage() handler发送消息的方法
sendMessageAtTime() 延时发送消息 定时(延时)
sendMessageDelayed() 延时
sendEmptyMessage(int what )根据标记发送空消息
post()
postAtTime(Runnable r, long uptimeMillis)
postDelayed(Runnable r, long delayMillis)
******enqueueMessage(queue, msg, uptimeMillis)将消息发送到消息队列*******
>2,Message 携带线程间消息数据的载体
属性:
int what 标记
int arg1 存整型的数据
int arg2
Object obj 存的复杂的数据
Handler target; 标识当前消息发送给那个Handler
Messenger replyTo; 信使对象 APp夸进程的通信
private static Message sPool; 消息池
private static int sPoolSize = 0; 记录消息池中剩余消息的数量
private static final int MAX_POOL_SIZE = 50;消息池中最多含有消息的数量
方法:
obtain()消息池中取消息
recycle():使用完的Message对象及时回收
setTarget(Handler target):设置接收消息的Handler对象
sendToTarget():将消息发送到目标的Handler中
setData(Bundle data):设置Bundle数据 到Message
getData()从msg中获取Bundle对象
>3,MessageQueue:消息队列 相当于通道 (队列:先进先出)
` 方法:next() 从消息队列里取消息
>4,Looper: 消息泵 等待MessageQueue有消息的时候 将消息取出给Handler对象
>
属性:
static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>(); 本地线程的变量 保证一个线程中只有一个Looper对象
private static Looper sMainLooper; 主线程中Looper 对象
final MessageQueue mQueue; 消息队列
方法:
prepare():准备Looper
loop():循环读取MessageQueue中message 是无限循环 mQueue.next();等待
myLooper():从线程本地变量中 获取当前线程的Looper对象
六 子线程向主线程发送消息
>1,在主线程里实例化一个Handler对象
>2,在子线程中发送消息
>3,在主线程里实例化一个Handler对象里的handlerMessage() 方法中进行处理消息
七 主线程向子线程发送消息
1,Looper.prepare() 获取Looper
2,实例化Handler对象(note:在1和3之间)
3,Looper.Loop() 无限循环 获取数据
4,在主线程中使用handler发送消息