Android异步消息处理机制分析
异步消息处理线程启动后会进入一个无限的循环体中,每循环一次,从内部的消息队列中取出一个消息,然后回调相应的消息处理函数,执行完成一个消息后则继续循环。若消息队列为空,线程则会阻塞等待。。。。。。
源码解析
异步消息处理机制涉及到主要三个类
Handler
、Looper
、Message
,其中Looper负责创建一个消息队列MessageQueue
,然后进入一个无限循环体Loop
中不断从该MessageQueue
中读取信息,消息的创建者就是单个或多个Handler
1.Looper
- 对于Looper主要是prepare()和loop()这两个方法
- 首先看prepare()方法的实现
1
2
3
4
5
6public static final void prepare(){
if(sThreadLocal.get()!=null){
throw new RuntimeException("Only one Looper may be created per thread");
}
sThreadLocal.set(new Looper(true));
}
- 首先看prepare()方法的实现
sThreadLocal是一个ThreadLocal对象,它可以在一个线程中存储变量。可以看到上面的代码将一个Looper实例set入ThreadLocal,并且判断了Loop实例是否为null,否则抛出异常。这说明了Looper.prepare()方法不能调用两次,同时也保证了一个线程中只有一个Looper实例
* 再看一下Looper的构造方法实现
1 | private |