Android面试题 请解释下单线程模型中Message、Handler、MessageQueue、Looper之间的关系
简单的说,Handler获取当前线程中的looper对象,looper用来存放从MessageQueue中取出的Message,再由Handler进行Message分发和处理,按照先进先出执行。
MessageQueue(消息队列):用来存放通过Handler发送的消息,通常附属于某一个创建它的线程,可以通过Looper.myQueue()得到当前线程的消息队列。
Handler:是Message的主要处理者,负责Message的发送,Message内容的执行处理。例如将消息发送到消息队列(sendMessage),更新UI组件(实现该类的handleMessage方法)
Looper:是Handler和消息队列之间的通讯桥梁,程序组件首先通过Handler把消息传递给Looper,Looper把消息放到队列。Looper也把消息队列里的消息广播给所有的Looper。
Message:消息的类型,理解为线程间交流的信息,处理数据后台线程需要更新UI,在Handler类中的handleMessage方法中得到单个的消息进行处理。
Handler机制的大致流程:
1.在Looper.loop()方法运行开始后,循环的按照接收顺序取出MessageQueue里面的非NULL的Message。
2.一开始MessageQueue里面的Message都是NULL的,当Handler.sendMessage(Message)到MessageQueue,该函数里面设置了那个Message对象的target属性是当前Handler对象。随后Looper取出了那个Message,则调用该Message的target指向的Handler的dispatchMessage函数对Message进行处理。在dispatchMessage方法里,如何处理Message则由用户指定,三个判断,优先级从高到低:
1)Message里面的Callback,一个实现了Runnable接口的对象,其中run函数做处理工作
2)Handler里面的mCallback指向的一个实现了Callback接口的对象,由其handleMessage进行处理。
3)处理消息Handler对象对应的类继承并实现了其中handleMessage函数,通过这个实现的handleMessage函数处理消息。
4)Handler处理完该Message后,Looper则设置该Message为NULL,以便回收。
最新文章
- jmeter(八)断言
- nav布局 在线演示 DIVCSS5
- MVC6的内置ActionResult类型
- [C/C++][文件操作] 对比目录并列出同名较新文件、较旧文件 0.1
- window+git+AndroidStudio+github
- 人工智能起步-反向回馈神经网路算法(BP算法)
- 253. Meeting Rooms II
- Oracle官网下载地址大全(包括11g、10g和9i)
- 理解JavaScript中作用域链的关系
- HDU 5256 - 序列变换 ,树状数组+离散化 ,二分法
- select * from (select P.*,ROWNUM RN FROM(select * from Mp_Relatedart where pubbaseid=785 order by ID ASC )P)M WHERE M.RN>;2 and M.RN <;= 7
- Android中使用";running services";查看service进程内存
- 从web图片裁剪出发:了解H5中的Blob
- 跟我一起读postgresql源码(九)——Executor(查询执行模块之——Scan节点(上))
- 【一天一道LeetCode】#258. Add Digits
- git基本概念
- jsp篇 之 Jsp中的内置对象和范围对象
- 【安全测试自学】初探web安全处测试(二)
- Python数据分析与挖掘常用模块
- BZOJ.1901.Dynamic Rankings(整体二分)