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

版权声明:博主原创文章,转载注明出处! https://blog.csdn.net/xmh19936688/article/details/51901419

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

猜你喜欢

转载自blog.csdn.net/xmh19936688/article/details/51901419