Handler消息处理机制.docx

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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对象。下边看一下

文档评论(0)

haihang2017 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档