Android 和其他系统一样,都是靠消息驱动来工作的。原理如下: 1、消息队列(MessageQueue),可以添加消息。 2、消息循环,从队列中取出消息进行处理,无限循环。 Looper 类:封装消息的循环过程。 Handler 类:辅助类,用于添加消息和处理消息(SendMessage 和 HanleMessage)。
####Looper 类:
Looper 类既然封装的是消息循环,就肯定有一个线程让它在不停的运作,代码如下:
public class LooperThread extends Thread{
public void run(){
....
Looper.prepare();
Looper.loop();
}
}
主要函数是 prepare()和 loop(),prepare 很容易理解,就是将 looper 对象绑定到当前的线程中来。下面来看 loop()代码:
public static final void loop(){
Looper me=myLooper();
MessageQueue queue=me.mQueue;
while(true){
Message msg=queue.next();
if(msg!=null){
if(msg.target==null){
return;
}
msg.target.dispatchMessage(msg);
msg.recycle();
}
}
}
看到 while(true)循环了吧,这里就是不断的从队列中提取消息,然后调用 dispatchMessage 来处理消息的地方。这里的 MessageQueue 就是消息队列了。
####Handler 类:
Handler 类中也有 mQueue 和 mLooper,和 Looper 中指的都是同一个。 下面我们看 Handler 是如何作为辅助类来帮助添加消息的:
public boolean sendMessageAtTime(Message msg,long uptimeMills){
boolean sent=false;
MessageQueue queue=mQueue;
if(queue!=null){
msg.target=this;
sent=queue.enqueueMessage(msg,uptimeMills);
}
return sent;
}
这里把 target 设为自己,是因为,Looper 循环后处理的函数为 msg.target.dispatchMessage(msg),而 Handler 同时也是消息处理的执行者,所以 target 应设为自己。
其实这两个类都比较简单,看源码自己也可以看懂了。用过 Handler 的人都知道,Handler 是用来多线程之间传递消息的。
Looper 对象是和一个线程相挂钩,TLS(Thread Local Save),默认是挂在主线程上。所以,如果有需要,不想 Looper 对象挂在主线程上,可以自己重写 Looper.prepare()和 Looper.loop()来自定义一个消息机制。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于