Looper类,handler类
(1)Looper类
android平台上的应用程序,是java应用程序,java程序的工作是消息驱动工作的。
分为两步:
第一步,有一个消息队列,像这个消息队列中添加消息,第二步就是响应消息,主要是通过一个消息循环来不断地从这个消息队列中取出消息,然后处理。
当事件要请求处理时,就会对应要发出处理请求的消息,这时就把这个消息添加到消息队列中去,一般添加位置是在队尾添加。
事件源发出的消息,可以是物理的,比如触摸键盘的摸个按键,系统接收到这个消息之后就对就此作出对应的处理;可以是系统或者应用程序本身要求的,也会发出请求消息。
Looper类中一个重要成员变量:就是有一个用于存放消息的消息队列。
looper.java
looper
{
private static void prepare(boolean quitAllowed)
public static Looper myLooper()
public static void loop()
}
分析这三个函数可知:在prepare中会new出来一个looper对象,通过一个threadlocal类对象将这个新建的looper和未来的调用线程关联到一起。
myLooper就是获取这个new looper 。
loop就是操作这个mylooper中获取到的looper对象,完成对消息的处理。
looper类的功能:
(1)封装一个消息队列。
(2)looper中通过threadlocal类和prepare把looper对象跟未来的工作线程关联起来。
(3)loop循环处理消息。
public static Looper myLooper()
code:
public static Looper myLooper() {
return sThreadLocal.get();
}
返回的就是prepare()中创建的Looper类。
这里应该提出的一个三者关系:
looper中有一个消息队列,用来存放待处理的Message,Message中有一个handler,handler用来处理Message。
(2)handler类
class handler
{
成员变量:
final Looper mLooper;
final MessageQueue mQueue;
final Callback mCallback;
public:
Handler()
{
// 获取到线程调用的那个looper。
mLooper = Looper.myLooper();
// 保存线程调用中那个looper的队列在自己里面。
mQueue = mLooper.mQueue;
回调函数的设置。
mCallback = null;
}
}
Handler类这时候完成的工作就是将自己定义的这些mLooper,mQueue,mCallback都指向looper的消息队列中。handler的功能可以创建消息和插入消息队列的工作,即handler分装一个消息添加功能,第二,handler还封装消息处理接口。
*handler的消息处理:
首先是looper中获取消息,得到这个消息之后会调用target.dispatchMessage(),再把这个消息给handler处理。
handler.java
public void dispatchMessage(Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
handleMessage(msg);
}
}
处理优先级:
Message自带,就用它自己的callback
handler中有全局的mcallback,就是这个mcallback处理。
前两者都不成立时交由子类handleMessage处理。
这里有一个值得注意的地方:
handler是作为looper的辅助类,可以完成向队列中添加消息的功能,同时可以处理消息。关联点是,handler定义了许多处理message的函数,同时,它把自己设置为message的target,这个target就是一个handler类,这时调用dispatchMessage()完成对消息的处理工作。