- 1、本文档共13页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Handler消息处理机制解读
Handler消息处理机制1.概述。Handler消息处理机制对于初学者来说,应该算是一块心病,几乎每次面试都会被问到,今天我抽时间从源码的角度总结一下相关知识点。先看一下我们平时是怎么用的,如下代码实例:public class MainActivity extends AppCompatActivity {private TextView text;private Handler mHandler;int i=0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);text = (TextView) findViewById(R.id.text);mHandler = new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);text.setText(变为:+msg.what); } }; }public void sendMes(View view){mHandler.sendEmptyMessage(i);i++; }}很简单,onCreat()方法中实例化了一个Handler实例,实现其handlerMessage(Message msg)方法,在方法中改变TextView的显示内容,在布局文件中放了一个Button设置其android:onClick=sendMes,看一下效果:相信每一个开发Android的人都会使用Handler更新页面,但是我们还要知道它是如何实现的,下面我们就剖析一下它的源码吧。2.源码解析我们都知道Handler机制涉及到了几个类,他们分别是Handler、Message、MessageQueue、Looper,先来了解一下这几个类的作用:Message:个人认为可以看成是我们要传递消息的载体,我们可以将信息设置到它的what属性,arg属性等。MessageQueue:统一存储Message的类,我们发出的每一个消息都将保存到MessageQueue中,我们可以从里边取消息进行处理。Looper:统一管理message,循环取出MessageQueue中存储的消息进行处理的类。Handler:发送Message,处理Message的类。下面我们先看一下Looper这个类,这个类有两个方法非常重要:prepare()、loop(),瞅瞅prepare()方法的实现:public static void prepare() {prepare(true);}调用了单参数的重载方法,传的是true,接着向下看:private static void prepare(boolean quitAllowed) {if (sThreadLocal.get() != null) {throw new RuntimeException(Only one Looper may be created per thread); }sThreadLocal.set(new Looper(quitAllowed));}在这里用到了ThreadLocal类,这个类为每一个用到它的线程提供一个副本,每一个线程只能访问自己的数据。判断不为空保证了我们这个方法只能被调用一次,创建了Looper实例,并将我们的true继续传递,那么我们看一下Looper的构造函数:private Looper(boolean quitAllowed) {mQueue = new MessageQueue(quitAllowed);mThread = Thread.currentThread();}在Looper中创建了MessageQueue对象,并传递true,大家也行会问这个true是干嘛的,它是后续用来判断消息循环是否可以终止的,系统在UI线程里边调用时传递的false,后边会介绍到,再看看他的MessageQueue中又做了什么呢?MessageQueue(boolean quitAllowed) {mQuitAllowed = quitAllowed;mPtr = nativeInit();}保存了传递进来的boolean值。这样我们就看完了Looper的prepare()方法的实现流程,总结一下:创建了当前线程对应的Looper对象并保存的mThreadLocal对象中,同时创建了与之对应的MessageQueue对象。下边看一下
您可能关注的文档
- Festo气动培训资料.ppt
- 7.1世界是普遍联系的.ppt
- GB2013新规范表格.doc
- 7.1未成年人的权利.ppt
- 7.1平面直角坐标系(第1课时).ppt
- 7.1家的意味课件1(共24张ppt).ppt
- 7.1东北地区.ppt
- GD-DT-DX 型列车自动清洗机安全技术操作规程.doc
- GDAB-QA-16安全生产责任制.doc
- GB4943培训教材.ppt
- 大学生教师简历模板.pdf
- 奥体中心综合训练馆配电监控方案.pdf
- 多色彩PEDOT-PSS-PVA复合导电纤维的湿法纺丝研究.pdf
- 外辐射源雷达信号的杂波抑制 .pdf
- 2023年甘肃省兰州市特种设备作业压力容器作业真题(含答案) .pdf
- 2023年-2024年BIM工程师之BIM工程师能力提升试卷A卷附答案 .pdf
- 2023年-2024年试验检测师之交通工程高分通关题型题库附解析答案.pdf
- 2023年-2024年监理工程师之交通工程目标控制通关提分题库及完整答案优质完整版723338685.pdf
- 2024企业总工述职报告(真题4篇) .pdf
- 2023年起重机司机(限门式起重机)参考题库含答案3 .pdf
文档评论(0)