在主线程中运行的部分,都可以直接使用Handler,因为在主线程启动的过程中(ActivityThread的main函数里)会调用Looper.prepareMainLooper(),Looper类中也直接定义了一个static的looper实例sMainLooper用于存放主线程的Looper,可以通过静态方法获取到。 因此,凡是在主线程中运行的代码段里 都可以直接new Handler()而不用去绑定Looper,MessageQueue;因为 因为 已经绑定过了呀^^^^^

Looper.prepare()方法是将当前线程绑定一个looper实例,并存储在TreadLocal中,一个线程只有一个looper对象。
looper中,有一个messagequeue,即消息队列;
handler可以通过sendmessage 等方法向队列中发送消息。
一个线程中可以有多个handler,handler 绑定当前线程的looper对象,以及其中的消息队列;
looper.loop()方法即循环调用MQ中的message,并且调用方送它的handler来处理它。
 
2、Looper实现原理
Looper类里包含一个消息队列对象和一个线程对象。当创建Looper时,会自动创建一个消息队列,同时将内部线程对象指向创建Looper的线程。当开启Looper后(looper.loop()),会自动进入无限for循环中,不断去遍历消息队列,如果没有消息则阻塞,有消息则回调handler的handlemessage方法进行处理。
3、Looper.prepare()
首先,要使用Looper机制一般会在当前线程中创建Handler对象,里面会自动创建一个looper对象和消息队列,这里面的消息队列属于当前线程空间。但此时的looper还不会去遍历,也没有绑定到当前线程。其中,looper对象内部也包含一个空消息队列对象和空线程。通过Looper.prepare()方法,先让该消息队列指向当前线程的消息队列,让空线程也指向当前线程。从而实现了绑定。
 
 
from:http://www.nowcoder.com/questionTerminal/4f88dfd8ec97432f80308031e73507c1?orderByHotValue=0&query=android&pos=33

最新文章

  1. java 线性规划 和lingo 比较
  2. http压力测试
  3. Bridging signals ZOJ 3627 POJ1631 HDU1950
  4. Win10的革新与突破
  5. 142 Linked List Cycle II(如果链表有环,找到入口结点Medium)
  6. CSS 怀疑 Verify
  7. 移动App-UI配制篇
  8. HDU 5772 String problem
  9. Python os与sys模块解析
  10. python2.7入门---条件语句
  11. Bootstrap3 排版-列表
  12. Android进阶(十一)Android系统架构讲解
  13. centos7下安装docker(3.2创建镜像build)
  14. FDMEMTABLE将修改后的数据序列为JSON
  15. 小程序模板template
  16. JAVA基础知识总结:十六
  17. 成功安装vscode中go的相关插件
  18. java线程状态及转换
  19. Kafka消息系统基础知识索引
  20. 微信小程序5.2.2版本,找不着resource下exml皮肤

热门文章

  1. switch case 注意事项+1 及 case合并综合练习例子
  2. springboot项目中引用其他springboot项目jar
  3. Thinkphp基于规则的Auth权限认证类
  4. 牛客网Java刷题知识点之为什么HashMap和HashSet区别
  5. linux服务器git pull/push时避免频繁输入账号密码
  6. maven module
  7. Excle 导入DataSet
  8. hibernate注解JPA
  9. jsp的动作标签
  10. 面向对象(基础oop)之类与对象