【转】android Looper 理解
2024-09-29 09:01:08
在主线程中运行的部分,都可以直接使用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
最新文章
- java 线性规划 和lingo 比较
- http压力测试
- Bridging signals ZOJ 3627 POJ1631 HDU1950
- Win10的革新与突破
- 142 Linked List Cycle II(如果链表有环,找到入口结点Medium)
- CSS 怀疑 Verify
- 移动App-UI配制篇
- HDU 5772 String problem
- Python os与sys模块解析
- python2.7入门---条件语句
- Bootstrap3 排版-列表
- Android进阶(十一)Android系统架构讲解
- centos7下安装docker(3.2创建镜像build)
- FDMEMTABLE将修改后的数据序列为JSON
- 小程序模板template
- JAVA基础知识总结:十六
- 成功安装vscode中go的相关插件
- java线程状态及转换
- Kafka消息系统基础知识索引
- 微信小程序5.2.2版本,找不着resource下exml皮肤