一.Looper
1.Loop的概述
主要是讲消息从消息队列中取出来,然后交给与message相对应的Handler处理。
2.Loop的属性
Thread<Local>:为每个线程创建一个副本 就是创建一个Loop在线程里面。 --set(Looper) 创建Looper的副本 ---get()获取Looper
MessageQueue:消息队列 --主要用来存储消息
Thread ---获取当前的线程
3.Loop的方法
prepare():初始化属性
myLooper():获取当前线程的Looper
loop:循环从消息队列中取出消息交给Handler
二.Handler
1.Handler的概述
将message和runnable发送出去并在未来某个时间处理
将要在不同线程上执行的操作放在队列里面 。 --一个Handler创建需要绑定 当前线程和其消息队列
2.Handler处理message的方法
/** * Handle system messages here. */ public void dispatchMessage(Message msg) { if (msg.callback != null) { handleCallback(msg); } else { if (mCallback != null) { if (mCallback.handleMessage(msg)) { return; } } handleMessage(msg); } }
从上面代码可以看出,Handler处理消息的机制。 先判断message.callback是否为空,不为空则执行message.callback
在判断 执行消息的Handler是否实现了CallBack接口,如果实现了就执行handler.mCallback.handleMessage方法,
我们可以设置返回值来选择是否需要执行handler.handleMessage方法
3.Handler的基本方法
obtainMessage() --创造一个与Handler相联系的Message(先从消息池中取出,若消息池中没有在生成一个Message)
post() ---创造一个带有Runnable的Message,并sendMessageDelay(message,0)出去
postAtTime() --- 创造一个带有Runnable的Message,并执行sendMessageAtTime()
postDelayed() ---创造一个带有Runnable的Message,并执行sendMessageDelayed()
sendMessage() ---将消息加到MessageQueue中
sendEmptyMessage() ---发送一个空消息到messageQueue中
sendMessageAtTime() ---在某个特定的时间,将消息加入MessageQueue中
sendMessageDelayed() ---推迟时间,将消息加入到MessageQueue中