android中的Handler Looper Message MessageQueue相互关系
1.handler用于主线程和子线程之间的相互通讯,通常是new handler,实现handlemessage方法来对message进行处理,而且在初始化handler的方法中必须传入一个Looper,如果在主线程newhandler,那么就共享主线程的looper,存在主线程的threadlocal(线程级共享)中;如果在子线程new handler,那么必须调用looper.prepare方法,然后还得调用looper.loop方法来轮询MessageQueue消息队列,这里又有一个重要的感念:消息队列,他是一个存放handler发送消息的容器,但是,存放Message并非实际意义的保存,而是将Message以链表的方式串联起来的,等待Looper的抽取。默认遵循FIFO(先入先出)规则,也可以指定when属性来自定义message的执行顺序.他是在looper的初始化是创建的.一个线程只能有一个消息队列–为什么?因为一个线程只能有一个Looper啊!消息队列中可以存放多个message,当我们调用Message.obtain()或者Handler.obtainMessage()获取Message对象,先判断消息池中有没有message,如果有就直接返回这个实例,没有则创建一个新的实例,调用removeMessages()时,将Message从MessageQueue中删除,同时放入到消息池中。当looper.loop取出一个消息后,会将这个消息回传给发送消息的handler来处理—-谁发送,谁处理.这是怎么实现的呢?其实内部有一个message.target = this,而这个this其实就是handler.looper.loop内部有一个while(true)死循环,会不停的轮询,当messagequeue中没有消息时,循环会阻塞,不会无限循环下去.
public class LooperThread extends Thread {
@Override
public void run() {
// 将当前线程初始化为Looper线程
Looper.prepare();
// ...其他处理,如实例化handler
// 开始循环处理消息队列
Looper.loop();
}
}
2.接下来,简单的看一下消息的循环过程:
(1)生成
Message msg = mHandler.obtainMessage();
msg.what = what;
msg.sendToTarget();
(2)发送
MessageQueue queue = mQueue;
if (queue != null) {
msg.target = this;
sent = queue.enqueueMessage(msg, uptimeMillis);
}
没有写完,有时间再补充