Handler的一些理解总结
2016-05-16 11:39
246 查看
Handler主要作用从其他线程访问UI线程
一般在新的线程里发送信息,在主线程里处理消息。
Message,MessageQueue,handler,Looper之间的关系
Handler发送Message到MessageQueue(先进先出),Looper负责读取MessageQueue中的消息给Handler去进行处理。
关于Looper的使用。
如果希望Handler正常工作,必须在当前线程中有一个Looper对象。
如果在UI线程中直接创建Handler实例,不需要创建Looper对象了,在UI线程中,系统初期化时已经创建Looper对象了。
如果在一个新的线程中,在创建一个Handler对象之前,必须为该线程准备一个Looper对象,(Looper.prepare),然后让
Looper跑起来(Looper.loop),去读取MessgerQueue中的Message,这样Handler才能正常工作。
有以下4种方式可以从其它线程访问UI线程:
· Activity.runOnUiThread(Runnable)
· View.post(Runnable)
· View.postDelayed(Runnable,
long)
· Handler
其中,重点说一下的是View.post(Runnable)方法。在post(Runnable action)方法里,View获得当前线程(即UI线程)的Handler,然后将action对象post到Handler里。在Handler里,它将传递过来的action对象包装成一个Message(Message的callback为action),然后将其投入UI线程的消息循环中。在Handler再次处理该Message时,有一条分支(未解释的那条)就是为它所设,直接调用runnable的run方法。而此时,已经路由到UI线程里,因此,我们可以毫无顾虑的来更新UI。
几点小结
· Handler的处理过程运行在创建Handler的线程里
· 一个Looper对应一个MessageQueue
· 一个线程对应一个Looper
· 一个Looper可以对应多个Handler
· 不确定当前线程时,更新UI时尽量调用post方法
一般在新的线程里发送信息,在主线程里处理消息。
Message,MessageQueue,handler,Looper之间的关系
Handler发送Message到MessageQueue(先进先出),Looper负责读取MessageQueue中的消息给Handler去进行处理。
关于Looper的使用。
如果希望Handler正常工作,必须在当前线程中有一个Looper对象。
如果在UI线程中直接创建Handler实例,不需要创建Looper对象了,在UI线程中,系统初期化时已经创建Looper对象了。
如果在一个新的线程中,在创建一个Handler对象之前,必须为该线程准备一个Looper对象,(Looper.prepare),然后让
Looper跑起来(Looper.loop),去读取MessgerQueue中的Message,这样Handler才能正常工作。
有以下4种方式可以从其它线程访问UI线程:
· Activity.runOnUiThread(Runnable)
· View.post(Runnable)
· View.postDelayed(Runnable,
long)
· Handler
其中,重点说一下的是View.post(Runnable)方法。在post(Runnable action)方法里,View获得当前线程(即UI线程)的Handler,然后将action对象post到Handler里。在Handler里,它将传递过来的action对象包装成一个Message(Message的callback为action),然后将其投入UI线程的消息循环中。在Handler再次处理该Message时,有一条分支(未解释的那条)就是为它所设,直接调用runnable的run方法。而此时,已经路由到UI线程里,因此,我们可以毫无顾虑的来更新UI。
几点小结
· Handler的处理过程运行在创建Handler的线程里
· 一个Looper对应一个MessageQueue
· 一个线程对应一个Looper
· 一个Looper可以对应多个Handler
· 不确定当前线程时,更新UI时尽量调用post方法
相关文章推荐
- 内核源码IO多路复用EPOLL
- javascript对象的相关操作小结
- 常用API
- 常用API
- 10035---最新的手把手教您linux环境下安装jdk1.8
- 在java中序列化与反序列化详解(转载)
- javascript数组操作
- iOS CocoaPods的安装流程
- DES加密算法
- 【MySql性能优化二】利用explain进行查询和分析sql语句
- 数据库连接池C3P0学习
- 【Swift-ObjC】冒泡排序
- 日期工具类DateUtils
- eclipse导入Android工程项目后出现错误汇总
- 未知宽高元素水平垂直居中
- 纯js实现瀑布流布局及ajax动态新增数据
- 重建所有表索引
- HTML5之2D物理引擎 Box2D for javascript Games 系列 第二部分
- 配置Docker beta for Mac访问私有镜像仓库
- LTE-室分问题定位思路