Handler的消息传递机制,实际上就是由handler将消息压到消息队列,并且把自身设置成msg的target,即msg.target = this。,由looper的loop方法不断取消息,取到消息后调用msg.target的分发,最后看是否是msg还是callback,如果是callback,则callback直接run起来,如果是消息,则调用handlermessage。
下面结合源码说一下这个流程图,sendmessage实际上是调用的sendMessageDelayed()方法
Delayed的代码实际上也是调用的下面的MessageAtTime方法,这个方法主要做了取队列,enqueue队列
enqueue队列前会把当前的handler设置我target,然后压倒消息队列中。
再看下他是怎么压的。
压倒队列后,looper的loop方法则会将消息取出,进行消息分发。
,这里注意下如果消息是callback的,即post的runable,这里会同步执行,要注意下,如果是普通消息,则会调用handleMessage。
也正是因为需要把handler作为target压倒队列,所以message会一直把持activity(匿名内部类会把持外部类的引用),如果消息没处理完则有可能内存泄漏,这时一般会做成静态内部类。