2013.08.21(二)——— android Handler+Looper+MessageQueue
2013.08.21(2)——— android Handler+Looper+MessageQueue
2013.08.21(2)——— android Handler+Looper+MessageQueue
参考:http://www.cnblogs.com/codingmyworld/archive/2011/09/14/2174255.html
http://www.cnblogs.com/xirihanlin/archive/2011/04/11/2012746.html
明确:
looper和messageQueue是线程唯一的,Looper和ThreadLocal绑定的
0、Looper+MessageQueue
Android主线程就是Looper线程,默认调用了
1、new Handler()
主线程创建handler,handler内部会得到创建时线程绑定的looper和messagequeue作为局部变量
2、handler.sendMessage()
这个在工作线程调用,handler内部会将这个message加入到messagequeue里面去,并设定
3、loop
loop循环从队列中得到了一个Message,然后判断targe是不是为null,调用
4、dispatchMessage
非常短,可以看出来 这就是我们实现handlerMessage方法的原因了 呵呵
当然还有一个handlerCallback分支
这个是处理post请求的 就是传递了一个Runnable对象的,然后会把msg.callback设置为传进来的Runnable对象
看清楚了 是run方法 不是start方法哦
总结下:
当sendMessage后,message就加入到主线程的MessageQueue里面了,就实现了线程切换,当主线程loop到后 就发给主线程穿件的Handler处理
2013.08.21(2)——— android Handler+Looper+MessageQueue
参考:http://www.cnblogs.com/codingmyworld/archive/2011/09/14/2174255.html
http://www.cnblogs.com/xirihanlin/archive/2011/04/11/2012746.html
明确:
looper和messageQueue是线程唯一的,Looper和ThreadLocal绑定的
0、Looper+MessageQueue
Android主线程就是Looper线程,默认调用了
Looper.prepare();//将一个Looper实例对象和ThreadLocal绑定,构造函数里面创建一个Messagequeue Looper.loop();//while(true)循环读取MessageQueue
1、new Handler()
主线程创建handler,handler内部会得到创建时线程绑定的looper和messagequeue作为局部变量
2、handler.sendMessage()
这个在工作线程调用,handler内部会将这个message加入到messagequeue里面去,并设定
msg.target = this,将handler传递给message,以便以后用该handler来处理message
3、loop
loop循环从队列中得到了一个Message,然后判断targe是不是为null,调用
msg.target.dispatchMessage(msg);传递给Handler来处理消息
4、dispatchMessage
public void dispatchMessage(Message msg) { if (msg.callback != null) { handleCallback(msg); } else { if (mCallback != null) { if (mCallback.handleMessage(msg)) { return; } } handleMessage(msg); } }
非常短,可以看出来 这就是我们实现handlerMessage方法的原因了 呵呵
当然还有一个handlerCallback分支
这个是处理post请求的 就是传递了一个Runnable对象的,然后会把msg.callback设置为传进来的Runnable对象
private final void handleCallback(Message message) { message.callback.run(); }
看清楚了 是run方法 不是start方法哦
总结下:
当sendMessage后,message就加入到主线程的MessageQueue里面了,就实现了线程切换,当主线程loop到后 就发给主线程穿件的Handler处理
1 楼
貌似掉线
14 小时前
昨天在公司编译代码期间,在探索一个异常的原因时也顺便看了android里的Handler, HandlerThread, Looper及其他相关代码。下面内容仅为个人看法。
“明确:
looper和messageQueue是线程唯一的,Looper和ThreadLocal绑定的 ”
这一点,我的理解与楼主并不全然。我认为并不能说Looper和ThreadLocal绑定。我的理解如下,如有不对,还请指正。
ThreadLocal,是java.lang包里的,这个类被设计来存储线程局部变量。这个类的设计很巧妙,注释里提到“ Thanks to Josh Bloch and Doug Lea for code reviews and impl advice ”,我想应该是他们两个设计及实现了这一块地方,目前我也正在看相关的文章消化中。而在android的Looper类中,仅是用它来存放Looper对象,而Looper对象,是与Handler绑定的。我对Handler的理解是它对线程和消息队列循环进行了封装。而每一个线程需要有自己的消息队列和循环读取,将Looper对象放在ThreadLocal当中,也就很自然了。
“明确:
looper和messageQueue是线程唯一的,Looper和ThreadLocal绑定的 ”
这一点,我的理解与楼主并不全然。我认为并不能说Looper和ThreadLocal绑定。我的理解如下,如有不对,还请指正。
ThreadLocal,是java.lang包里的,这个类被设计来存储线程局部变量。这个类的设计很巧妙,注释里提到“ Thanks to Josh Bloch and Doug Lea for code reviews and impl advice ”,我想应该是他们两个设计及实现了这一块地方,目前我也正在看相关的文章消化中。而在android的Looper类中,仅是用它来存放Looper对象,而Looper对象,是与Handler绑定的。我对Handler的理解是它对线程和消息队列循环进行了封装。而每一个线程需要有自己的消息队列和循环读取,将Looper对象放在ThreadLocal当中,也就很自然了。