Android消息机制之一---Looper
2016-03-03 09:01
295 查看
1.1Looper
位置:
/frameworks/base/core/java/android/os/Looper.java
Looper:循环者的意思,他被设计用来将一个普通线程变成Looper线程,即循环工作的线程。
Looper类基于MessageQueue(消息队列)来管理一个循环事件。并且这个消息队列的状态是在MessageQueue(消息队列)或者Handler中设置和更改的,并不是在Looper中。也就是说,Looper通过一个由其他类控制的MessageQueue来维持循环。其中MessageQueue已经封装到了Looper中,对于开发者来说,MessageQueue是透明的,直接操作的是Message。
如何是一个正常的线程变成Looper线程:
通过两行核心代码,普通线程就会变成Looper线程。
Looper.prepare()
Looper.loop()
通过Looper.prepare(),线程中就会出现一个Looper的对象,它内部维护一个消息队列,并且通过prepare()源码我们发现,一个线程只能对应一个Looper对象。
其实,将普通线程,变成Looper线程比较简单。接下来,我们看下Looper的源码,分析下它的实现。
每个线程中的Looper对象其实就是一个ThreadLocal,即线程本地存储(TLS)对象。
prepare(BooleanquitAllowed);方法是利用TLS来产生Looper对象。
Looper的构造方法。
生成MessageQueue;
mThread指向当前线程;
Looper中的主循环,loop(循环),知道quit()后执行终止loop
当Looper调用loop()后,looper线程开始真正的工作。
Looper的其他函数:
myLooper()//获取当前Looper
//getMainLooper()获取application中的主线程的looper
quit()函数;
//一些消息可能还没有提交,在loop处理结束之前
//所有消息都处理结束,并且没有新的消息提交
其中android中的Actvity也为一个Looper线程。
Looper循环者,它设计是用来是一个普通线程变成Looper线程。主要作用是使一个线程不断循环,一旦有新任务则完成新任务,之后继续循环等待下一个任务。
总结:
1.每个线程有且最多只能有一个Looper对象,它是一个ThreadLocal
2.Looper内部有一个消息队列,loop()方法调用后线程开始不断从队列中取出消息执行
3.Looper使一个线程变成Looper线程。
位置:
/frameworks/base/core/java/android/os/Looper.java
Looper:循环者的意思,他被设计用来将一个普通线程变成Looper线程,即循环工作的线程。
/* 56*APIImplementationNote: 57* 58*Thisclasscontainsthecoderequiredtosetupandmanageaneventloop *basedonMessageQueue.APIsthataffectthestateofthequeueshouldbe *definedonMessageQueueorHandlerratherthanonLooperitself.Forexample, *idlehandlersandsyncbarriersaredefinedonthequeuewhereaspreparingthe *thread,looping,andquittingaredefinedonthelooper. */ |
如何是一个正常的线程变成Looper线程:
publicclassLooperThreadextendsThread{ @Override publicvoidrun(){ //将当前线程初始化为Looper线程 Looper.prepare(); //...其他处理,如实例化handler //开始循环处理消息队列 Looper.loop(); } } |
Looper.prepare()
Looper.loop()
通过Looper.prepare(),线程中就会出现一个Looper的对象,它内部维护一个消息队列,并且通过prepare()源码我们发现,一个线程只能对应一个Looper对象。
其实,将普通线程,变成Looper线程比较简单。接下来,我们看下Looper的源码,分析下它的实现。
//sThreadLocal.get()willreturnnullunlessyou'vecalledprepare().
|
/**Initializethecurrentthreadasalooper.
publicstaticvoid
} //最后会调用该方法; privatestaticvoid if( thrownew }
} |
private
} |
生成MessageQueue;
mThread指向当前线程;
Looper中的主循环,loop(循环),知道quit()后执行终止loop
/** *Runthemessagequeueinthisthread.Besuretocall *{@link#quit()}toendtheloop. */ publicstaticvoid final if( thrownew } //得到当前Looper的MQ(消息队列) final //Makesuretheidentityofthisthreadisthatofthe//localprocess, //andkeeptrackofwhatthatidentitytokenactually//is. //确定该线程是属于本地进程,不影响Looper理解
finallong for(;;){//开始循环
if( //Nomessageindicatesthatthemessagequeueisquitting. return; } //日志内容 //Thismustbeinalocalvariable,incaseaUIeventsetsthelogger
if(
} //重要,真正的处理工作借给Message的target,即handler
if(
} //ID处理 //Makesurethatduringthecourseofdispatchingthe //identityofthethreadwasn'tcorrupted. finallong
+ + + + } //回收Message资源
} } |
当Looper调用loop()后,looper线程开始真正的工作。
Looper的其他函数:
myLooper()//获取当前Looper
publicstatic@ return } |
/** *Returnstheapplication'smainlooper,whichlivesinthemainthreadoftheapplication. */ publicstatic synchronized( return } } |
//一些消息可能还没有提交,在loop处理结束之前
publicvoid
} |
publicvoid
} |
Looper循环者,它设计是用来是一个普通线程变成Looper线程。主要作用是使一个线程不断循环,一旦有新任务则完成新任务,之后继续循环等待下一个任务。
总结:
1.每个线程有且最多只能有一个Looper对象,它是一个ThreadLocal
2.Looper内部有一个消息队列,loop()方法调用后线程开始不断从队列中取出消息执行
3.Looper使一个线程变成Looper线程。
相关文章推荐
- 【Android】17.0 第17章 服务绑定—本章示例主界面
- Android内存优化五:Android垃圾回收器机制
- Android内存优化四:从代码角度进行优化
- Android内存优化三:对Bitmap的内存优化
- Android内存优化二:使用软引用和弱引用
- Android Studio首次运行卡在Fetching android SDK compoment information
- 2014 android毕设代做 代做Android毕设 安卓毕设
- android开发步步为营之65:解决ScrollView和ListView触摸事件onInterceptTouchEvent相互冲突问题
- 2015最流行的Android组件、工具、框架大全
- 一对多 pc上运行android客户端
- Android开发者编码风格
- 错误记录:Resource ID #0x7f040006 type #0x12 is not valid
- 个人进阶之路——安卓蓝牙模块(4)
- Android布局管理器总结一:LinearLayout
- 小刚的Android研究笔记~在未开启USB调试的Android手机绕过锁屏密码
- Android事务理解和Fragment的执行事务
- iMindMap Android中字体格式该怎么进行修改
- 第三方知乎专栏应用Android源码
- Kotlin 开发Android
- Android ADB server didn't ACK * failed to start d