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(安卓)的Camera架构介绍
  2. Android自定义权限
  3. Android横竖屏切换问题
  4. Android之自定义View
  5. Android--DatePickerDialog日期控件
  6. Android进程间通信--消息机制及IPC机制实现
  7. Android重要控件概览(中)
  8. Android启动过程
  9. Android(安卓)8.1 zygote创建新应用进程

随机推荐

  1. android PopupWindow 底部阴影外部空间取
  2. Android(安卓)BaseExpandableListAdapter
  3. Android:横行滚动且隔行变色的ListView控
  4. Android屏幕点亮(常亮)及屏幕解锁和锁定
  5. Android(安卓)关于wifi管理的代码
  6. Android(安卓)proguard(混淆)模板
  7. Android快速开发之封装标题栏
  8. android 实现自定义隐藏式菜单
  9. android 开发环境搭建
  10. 构建更好的应用--Xamarin平台