Android自助餐Handler消息机制完全解析(三)Handler解析
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()
。前者直接调用参数中message
的message.calback.run()
解决问题,后者则是空方法体,显然需要开发者重写。至于这个方法什么时候被调用就是Looper的事了(见Looper解析)。