本人应届生一枚,由于找工作需要,最近又重新撸了一遍Handler机制,正好借此机会养成写文档的好习惯,从此以后做一个游荡于csdn以及各个技术网站的孤魂野鬼。
首先,关于handler机制的机制类型,它是一个异步回调机制(至于异步回调是什么鬼,请自行百度)。
其次,我们一般在什么时候使用handler?
答:handler一般作用于线程之间的异步操作。
我们在了解Handler的时候,主要需要了解的就是Handler、Message、以及Looper之间的关系。
那么我们从Looper开始说起。
在线程刚刚启动的时候会通过ThreadLocal来新建一个Looper,然后Looper会创建一个MessageQueue,也就是存放我们发送的Message的地方啦。Looper会调用Looper.loop()方法指定当前的Handler,然后无限的去循环直至MessageQueue里面的每一个Message都被取出来通过dispathMessage(Message msg)方法将msg发送给指定的Handler。当MessageQueue里面没有Message的时候,线程就会阻塞,以保证内存的正常使用。这里需要注意的是ThreadLocal的作用就是保证每个线程只有一个指定的Looper。
public static final void prepare() {
if (sThreadLocal.get() != null) {
throw new RuntimeException(“Only one Looper may be created per thread”);
}
sThreadLocal.set(new Looper(true));
}
从这里我们就能看出每个线程只能有一个ThreadLocal对象;
然后我们再说Handler,我们在创建Handler之前必须先创建Looper,然后将Handler与Looper进行关联,而且由于我们需要将Message发送给指定的MessageQueue,如果不创建Looper我们就不知道将消息发送给谁。在创建的时候,线程会先查询消息池中是否有消息,如果有消息,直接取出来使用,如果没有就创建消息,我们通过Message.obtain()方法从消息池中取消息.。然后通过sendMessageAtTime()方法获取内部的MessageQueue,然后通过其中的enqueueMessage*(msg,uptimeMillis)*将消息发送到指定的MessageQueue中。
总结起来就是Looper是用来创建和管理MessageQueue的,它通过无限循环将MessageQueue中的Message取出,通过dispatMessage()方法发送给Handler。Handler是用来发送、接收和处理Message的,在创建Handler之前必须创建一个Looper然后与之关联,最后通过sendMessageAtTime()方法指定MessageQueue对象,并且发送Message。需要注意的是MessageQueue是一个单链表而不是一个队列,各位亲们不要被名字所迷惑了奥!!
代码出处出自鸿扬大神Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系