Handler、MessageQueue 、Looper的关系
来源:互联网 发布:九维网络登录 编辑:程序博客网 时间:2024/05/01 04:37
Handler、MessageQueue 、Looper的关系
Looper:是一个分发器,在主线程创建的时候就会创建一个Looper对象。
MessageQueue:消息队列,是由Message组成的一个队列
handler:从MessageQueue中获取到message,然后执行动作,可以在主线程和子线程之间互相传递数据
看了源码之后大概说下他们的关系:
在主线程创建之后会自动创建一个looper对象,创建looper对象时候会创建一个MessageQueue,
而looper是一个轮询器,会不停轮询messagequeue中的消息,在获取到消息之后就会把这个消息交给对应的handler来处理,
在主线程中创建一个handler对象,这个handler不仅可以获取到消息进行处理,也可以把一个消息放到消息队列中。
举一个例子来说明一下:在子线程中更新Ui
根据android系统机制,ui只能在主线程中跟新,如果我们在子线程中更新UI,就会引起ANR异常。
handler可以解决这个问题,在主线程和子线程之间传递信息
做法就是,先在主线程中创建一个handler对象,looper对象和messageQueue对象Handler、MessageQueue 、Looper的关系是不用创建的Handler、MessageQueue 、Looper的关系,
因为在系统源码中这个是在主线程创建的时候就创建好了。然后在主线程中重写handlerMesage()方法,
这个方法是handler接受到message之后由系统自动调用执行,不需要由程序员主动调用,我们把更新ui的代码放到这个方法中。
然后在子线程中通过handler调用sendMessage(0方法来发送一个消息到消息队列中。发送完这个消息,
获得到这个消息的之后就会执行handlerMessage()方法,因为这个方法是在主线程中实现的,所以就可以更新了。
handler机制; 可以在主线程中给子线程发送消息,也可以在子线程中给主线程发送消息:
在子线程中给主线程发送消息; 在主线程中创建一个handler对象,
然后重写handlerMessage()方法,在子线程中调用handler.sendEmptyMessage()方法,
然后再handlermessage()方法中就可以执行我们想要执行的操作了,比如说更新Ui
在主线程中给子线程发送消息:在子线程中new一个handler对象,然后重写handlerMessage()方法,在主线程sendEmptyMessage();只是这样是不行的,因为handler要处理消息,但在子线程中是没有Looper对象的,我们要通过Looper.prepare()来创建一个Looper对象,
在这里Looper对象被创建是时候会创建一个MessageQueue,这样就有Looper了,然后再执行完操作(一般是hander.handlerMessage())之后接下来要执行loop额外.loop()方法去轮询这些消息,让handler来处理这些消息。
在安卓源代码中looper.loop()方法是一个永远为true的while循环,所以我们要在子线程中执行的动作,都要在这个方法前去执行,如果在这个方法后去执行的话,就不能被执行到
- Handler、MessageQueue 、Looper的关系
- Handler Looper MessageQueue 的关系
- Handler,Looper,MessageQueue关系
- Activity/MessageQueue/Handler/Looper之间的关系
- Andriod中Handler,Looper,MessageQueue的关系
- Looper, messageQueue和Handler的关系
- Handler Looper Message MessageQueue 的关系
- Message、Handler、MessageQueue、Looper之间的关系
- handler、looper、messagequeue之间的关系
- Handler与looper、MessageQueue的关系
- Handler Looper MessageQueue 之间的关系
- Android--Handler,Looper,MessageQueue的关系
- Message,Handler,MessageQueue,Looper之间的关系
- 理解Handler、Looper、MessageQueue的关系
- Handler,Looper,Message,MessageQueue的关系
- Message、Handler、MessageQueue、Looper之间的关系
- 详解Message,Handler,MessageQueue,Looper的关系
- Handler、Looper和MessageQueue的关系
- spark SQL Running the Thrift JDBC/ODBC server
- 机器学习算法 - k-means Clustering K均值聚类
- MySQL服务无法启动(2003 - Can't connect to MySQL server on‘localhost' (10061).)
- killall
- red hat Linux操作系统下载地址
- Handler、MessageQueue 、Looper的关系
- 中兴V5s N918st专用中文TWRP2.8.5.1 recovery(电量显示正常)
- Composer PHP用来管理依赖关系的工具
- Android Studio使用小指南
- Java代码实现随机生成汉字
- 方法重载(overload)的例子分析(摘自<深入理解Java虚拟机>)
- 设计模式C++学习笔记之十九(State状态模式)
- HDU 3032解题报告
- 回文字符串