`
GLC
  • 浏览: 110700 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

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的构造函数:



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自己来继续处理。


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics