要深入了解Handler的工作原理可能需要先了解关于它的几个组件:
Message:
Handle接受和处理的消息对象。
MessageQueue:
消息列队,采用先进先出的方式管理Message。Looper对象创建时会自动创建该对象。
Looper:
负责读取MessageQueue中的消息对象,调用它的loop方法开始读取消息,并交给Handler来处理。
且每个线程只能拥有一个Looper
大致流程如下:
graph TD
10=>start: Looper初始化
20=>operation: loop()
30=>operation: 读取Message
40=>condition: 读到
50=>operation: 交给Handler处理
60=>end: 结束
10->20->30->40
40(yes)->50->30
40(no)->30
Handler想要正常工作,当前的线程必须有一个Looper对象。
这里分两种情况:
UI主线程,系统会自动初始化一个Looper对象,因此UI线程可以直接创建Handler使用。
其他非UI的线程,这时就必须我们来手动创建Looper对象了。
创建方法:
启动方法
prepare()的源码:
public static final void prepare(){
if(sThreadLocal.get()!=null){
throw new RuntimeException("Onlu one Looper may be created per thread");
}
sThreadLocal.set(new Looper());
}
prepare()方法创建保证了当前线程的Looper对象唯一
这边不可以使用一般的构造器来创建对象,Looper源代码中是这样的:
private Looper(){
mQueue = new MessageQueue;
mRun = true;
mThread = Thread.currentThread();
}
尊重作者,转载请注明出处!
版权申明:本文版权归作者所有,未经授权,任何单位或个人不得以任何形式转载、摘编或利用其它方式使用本博客内容。作者保留追究相关法律责任的权利。如需使用博客内容,请与作者联系获得授权。感谢对本文的尊重与支持。
免责声明:本网站所载内容仅供参考,不构成任何专业建议。用户基于本网站内容作出的决策,风险自担。对于因使用本网站内容而产生的任何直接或间接损失,本网站不承担任何责任。请用户审慎判断,理性使用。