Android消息机制中,Looper处于核心地位,它类似于一个消息泵,不断从MessageQueue中读取数据,然后分发给Handler去处理。
一、官方建议的使用形式:
class LooperThread extends Thread {public Handler mHandler;public void run() {Looper.prepare();mHandler = new Handler() {public void handleMessage(Message msg) {// process incoming messages here}};Looper.loop();}}


二、Looper源码阅读:
上述子线程中调用了Looper.prepare()和Looper.loop()到底做了什么事情?
1、先看prepare()方法:
    public static void prepare() {        if (sThreadLocal.get() != null) {            throw new RuntimeException("Only one Looper may be created per thread");        }        sThreadLocal.set(new Looper());    }

prepare是一个静态方法,那就意味着可以直接通过类名访问,这个方法只做了一件事,就是创建一个Looper对象,把这个对象放到sThreadLocal中。在创建之前会判断sThreadLocal是否为空,即保证当前只有一个Looper对象。

那创建Looper对象时做了什么事情呢?
    private Looper() {        mQueue = new MessageQueue();        mRun = true;        mThread = Thread.currentThread();    }

创建一个消息队列;
设置run运行变量;
跟当前线程绑定;



2、loop方法:
public static void loop() { while (true) {            Message msg = queue.next(); // might block            if (msg != null) {                if (msg.target == null) {                    // No target is a magic identifier for the quit message.                    return;                }msg.target.dispatchMessage(msg);msg.recycle();}}

上述方法只截取了部分,可见也是一个静态方法,做的事情也很简单,很单调:
不停的检查MessageQueue,拿到Message,根据Message的target将消息分发给Handler,分发完成之后回收消息;
msg.target是handler,这句话是在looper中执行的,然后进入dispatchMessage(msg),也就是说,handler的dispatchMessage(msg)这个方法是在looper的线程中执行的,二dispatchMessage就会执行handler 的handlerMessage方法了,这个显然是在looper的线程中执行的了。

总之,handler的线程就是提供下handler这个实例变量而已,而真正循环处理消息的线程是looper所在的线程了。

3、setMainLooper和getMainLooper方法可以存取主线程的Looper对象。

总结:
Thread和Looper是一一对应关系。
Thread和MessageQueue也是是一一对应关系。
俗一点说:一个Thread只有一个Looper对象,一个MessageQueue对象;
Looper分发消息是阻塞式的(might block),即一个消息分发完成之后才会处理下一个消息;
“Looper就是一个While循环,不停的从MessageQueue读取Message并分发给Handler处理,而调用Looper.loop()启动了循环”


后续文章:
Android知识梳理:消息机制之MessageQueue
Android知识梳理:消息机制之Handler
Android知识梳理:消息机制之Message

更多相关文章

  1. Android SDK 安装中组件的离线安装方法 (share)
  2. Android中打开新的Activity的三种方法
  3. android UI线程安全问题
  4. Android EditText默认不弹出输入法的实现方法
  5. activity中onSaveInstanceState方法调用时机详解
  6. Android 利用getIdentifier()方法获取资源ID
  7. Android cursor query方法详解

随机推荐

  1. 关于XML中的名称空间的示例代码分享
  2. 初步认识XML基础知识(图文)
  3. 详细介绍XML DTD于XML Schema学习的示例
  4. 具体介绍使用xsd验证xml的代码分享
  5. XML数据解析的系统方法的代码分享
  6. XML加密和XML签名简介的具体介绍
  7. 详细介绍XML特殊字符的问题
  8. 详解根据xsd生成xml文档的示例代码分析
  9. 自定义XML动态配置程序的示例代码分享
  10. Schema验证XML概念的实例代码详解