Android异步消息处理机制分析

异步消息处理线程启动后会进入一个无限的循环体中,每循环一次,从内部的消息队列中取出一个消息,然后回调相应的消息处理函数,执行完成一个消息后则继续循环。若消息队列为空,线程则会阻塞等待。。。。。。

源码解析

异步消息处理机制涉及到主要三个类HandlerLooperMessage,其中Looper负责创建一个消息队列MessageQueue,然后进入一个无限循环体Loop中不断从该MessageQueue中读取信息,消息的创建者就是单个或多个Handler

1.Looper

  • 对于Looper主要是prepare()和loop()这两个方法
    • 首先看prepare()方法的实现
      1
      2
      3
      4
      5
      6
      public static final void prepare(){
      if(sThreadLocal.get()!=null){
      throw new RuntimeException("Only one Looper may be created per thread");
      }
      sThreadLocal.set(new Looper(true));
      }

sThreadLocal是一个ThreadLocal对象,它可以在一个线程中存储变量。可以看到上面的代码将一个Looper实例set入ThreadLocal,并且判断了Loop实例是否为null,否则抛出异常。这说明了Looper.prepare()方法不能调用两次,同时也保证了一个线程中只有一个Looper实例

* 再看一下Looper的构造方法实现
1
private