Handler message looper三者间的信息通讯
Handler message looper三者间的信息通信
Handler message looper三者间的信息通信
三者组成一个异步消息处理线程
在应用时、我们一般常重写handlerMessage方法,来刷新UI或者进行线程间的信息通信。但内部的实现过程我们需要通过查看源代码来了解。分析如下:
线程启动后,先调用Looper中的prepare()方法、方法中判断是否有Looper对象,没有则进行实例化并将其放入Threadlocal中。同时、Looper的构造函数中,实例化一个消息队列MessageQueue,存放信息及等待处理。
然后进入loop方法:获取Threadlocal中的Looper对象,取出消息队列;然后进入死循环:不断从消息队列中取信息,没有消息则线程阻塞、当有消息时调用msg.target.dispatchMessage(msg)方法。这里的msg.target就是Handler对象。
所以、Looper的作用:与当前线程绑定,保证一个线程只会有一个实例;同时一个Looper实例也只有一个MessageQueue。
现在有了MessageQueue 也有了不断取消息的动作。下面看Handler
先看Handler的构造函数:
构造函数中,获取了消息队列。然后看它的dispatchMessage方法
所以、Handler在获取msg的同时、又将自己本身赋值给msg.target;如果MessageQueue一旦获取到msg;则又会调用handler自己来继续处理。
Handler message looper三者间的信息通信
三者组成一个异步消息处理线程
在应用时、我们一般常重写handlerMessage方法,来刷新UI或者进行线程间的信息通信。但内部的实现过程我们需要通过查看源代码来了解。分析如下:
线程启动后,先调用Looper中的prepare()方法、方法中判断是否有Looper对象,没有则进行实例化并将其放入Threadlocal中。同时、Looper的构造函数中,实例化一个消息队列MessageQueue,存放信息及等待处理。
然后进入loop方法:获取Threadlocal中的Looper对象,取出消息队列;然后进入死循环:不断从消息队列中取信息,没有消息则线程阻塞、当有消息时调用msg.target.dispatchMessage(msg)方法。这里的msg.target就是Handler对象。
所以、Looper的作用:与当前线程绑定,保证一个线程只会有一个实例;同时一个Looper实例也只有一个MessageQueue。
现在有了MessageQueue 也有了不断取消息的动作。下面看Handler
先看Handler的构造函数:
public Handler(Callback callback,Boolean async){ mLooper = Looper.myLooper(); mQueue = mLooper.mQueue; mCallback = callback; }
构造函数中,获取了消息队列。然后看它的dispatchMessage方法
private void dispatchMessage(Message msg){ msg.target = this;//this 指代Handler handlerMessage(msg); }
所以、Handler在获取msg的同时、又将自己本身赋值给msg.target;如果MessageQueue一旦获取到msg;则又会调用handler自己来继续处理。