Android开发中,用到Handler的场景很多,今天研究了一下它的源码,做个记录。
Handler包含的主要方法:post, postAtTime, postDelayed, sendEmptyMessage, sendMessage等,其中post执行runnable对象,send相关代码可以传递参数然后Handler的handleMessage来执行。
Handler内部有一个MessageQueue和一个Looper,我们每次调用的sendMessage,post之类的方法,就是把Message存入MessageQueue中,相应的remove方法也是从MessageQueue中移除Message。然而Handler中的MessageQueue是由它的Lopper创建的,也就相当于我们把Message传递给了Looper,然后Looper在loop方法中调用Handler的dispatchMessage方法。
dispatchMessage中首先判断Message中Runnable是否为null,如果不是null,则执行此Runnable;如果是null则检查Handler中的CallBack中是否为null,如果不为null,则执行其handleMessage来处理Message,最后才会调用Handler中的handleMessage方法,也就是我们常实现的。
这时候终于明白dispatchMessage与sendMessage的区别了,有时候直接调用dispatchMessage实际上没有把Message添加到MessageQueue中。
关于Message,虽然它的构造方法时public的,但是通常用Message.obtain()方法或者handler 的obtainMessage()方法来获得Message的实例,Message中有个static的全局消息池,obtain方法就是从消息池中取得的实例。Message中还有一个Runnable,用于保存post中的Runnable。
Looper中有一个静态变量ThreadLocal<Looper>来保存Looper,我们使用Looper的顺序是prepare方法,然后再调用loop方法。默认情况下,每个应用启动的时候都会创建一个主的handler,用于处理Activity,service,广播,以及窗口的事件。