Android自助餐Handler消息机制完全解析(三)Handler解析

  • Android自助餐Handler消息机制完全解析三Handler解析
    • Handler
      • 构造方法
      • 创建消息obtainMessage
      • 发送消息sendMessage
      • 移除消息removeMessage
      • 处理消息dispatchMessage

Handler

这便是我们平时直接使用的主角。继承Handler重写其handleMessage()方法来处理消息,在需要的时候调用sendMessage()来发消息,剩下的就不用管了。现在来看看“我们不用管”的这部分都干了点啥。

构造方法

所有的构造方法最终会会调用两个实现,如果制定了Looper,则会调用三个参数的重载,否则会调用两个参数的重载。而后者则会调用Lopper.myLooper()来获取looper。两个构造方法除了给mLooper赋值外,还给mQueue赋值为mLooper.mQueue;给mCallback赋值为指定的callback或null;给mAsynchronous赋值为指定的boolean或false。
在两个参数的构造方法中,给上述四个成员赋值前有段if(FIND_POTENTIAL_LEAKS){}包裹的代码段,该变量定义为private static final boolean FIND_POTENTIAL_LEAKS = false;因此推断这部分是开发时调试用的,此处不做理会。

创建消息obtainMessage()

根据源码可以看出,所有该方法的重载都调用了Message.obtain()对应的重载,可以看Message.obtain()的来龙去脉来了解,此处不再赘述。需要注意的是,每个重载都传入了this参数并赋值给了message的target。这里先记着就行,后面会介绍如何通过target调用dispatchMessage()处理消息。

发送消息sendMessage()

所有的sendEmptyMessage()重载与sendMessageXXX()以及postXXX()最终都会调用enqueueMessage()方法,该方法则调用queue.enqueueMessage()方法将消息添加到消息队列。关于消息队列如何管理消息可以看MessageQueue的队列管理一文。

移除消息removeMessage()

所有的removeMessages()重载与removeCallbacks()重载最终都是调用mQueue.removeMessages()方法,即通过MessageQueue来实现该操作。详细分析可以看MessageQueue的队列管理一文。

处理消息dispatchMessage()

消息处理最开始被调用的不是handleXXX()方法,而是dispatchMessage()方法。该方法会根据消息是否有callback来判断该交给handleCallback()还是handleMessage()。前者直接调用参数中messagemessage.calback.run()解决问题,后者则是空方法体,显然需要开发者重写。至于这个方法什么时候被调用就是Looper的事了(见Looper解析)。

更多相关文章

  1. Android进程间通信--消息机制及IPC机制实现
  2. android studio 编译的时候出现的错误和解决方法
  3. Android 禁止Edittext弹出系统软键盘 的几种方法
  4. Android 使用 第三方 Sweet Alert Dialog 的时候出现的报错解决
  5. Android Camera 方法分析
  6. Android EditText不显示光标的解决方法
  7. android杀进程方法
  8. EditText不显示光标的解决方法
  9. android ScrollView边界阴影方法

随机推荐

  1. 如何快速画出金属的质感?金属质感的画法
  2. 怎么画动漫人物?动漫插画绘画教程
  3. 字符串与数组的 api实例演示
  4. Android(安卓)学习笔记--android――Acti
  5. Android(安卓)Vibrator手机振动 API详解
  6. FFmpeg的Android平台移植—编译篇
  7. Android(安卓)- 绘画出圆并保存为图片(详)
  8. Android(安卓)Interface Definition Lang
  9. Android(安卓)常用RGB值以及中英文名称
  10. Android(安卓)com.android.internal.R 添