概述#
MessageQueue##
MessageQueue并不是一个队列对象,而是通过一个单链表的数据结构来维护消息列表。
对于一个单链表,插入方法和取出方法是主要的方法类型。
- 插入方法——enqueueMessage:
就是一个典型的单链表插入操作 - 取方法——next
是一个无限循环的方法,如果没有消息,那么就会一直阻塞。当有新消息来的时候,就会把这个方法取出并在单链表当中删除。
Looper##
Handler需要一个Looper才能工作。通过Looper.Prepare()方法进行Looper的创建。另外还有一个Looper.prepareMainLooper是用来创建主线程当中的Looper的。另外有一个getMainLooper()方法让我们可以在任何地方取得主线程的Looper。
Looper提供了quit和quitSafety两个方法来退出Looper。退出Looper后,Handler就不能工作了。我们需要进行退出,放置Looper一直阻塞在那边。
Loop方法###
对于一个Looper来说,最重要的是loop方法,这也是一个死循环,如果MessageQueue传过来的message是null,才会退出。quitSafety就是Queue最后添加一个退出标记,让当前消息处理完后,Looper退出。
如果MessageQueue返回了新消息,调用msg.target(发送这个消息的handler对象)的dispatchMessage()方法来分发消息。这样就可以成功地到指定线程当中去执行任务了。
Handler##
Handler主要通过post和send的一系列方法来进行消息的方法。其中post最终调用的还是send方法。send方法最终只是向消息队列插入了一条消息。之后就会调用消息队列的next的方法,交给looper。而looper接收到这个消息后开始处理,最后消息传给Handler,调用dispatchmessage方法,分发消息。
dispatchMessage###
分发消息的过程主要看Message对象是否有回调callback-----一个Runnable对象,实际上也是post方法当中所传递的Runnable对象。如果有,交给他执行。如果没有,那么需要调用handler的handleMessage方法来对消息处理。
创建Handler对象法##
一般来说,我们创建handler对象,需要派生一个handler的子类,重写handMessage方法并且实例化。
不过,通过callback,我们可以不派生子类就可以创建handler对象,典型的就是让我们的类实现callback接口就可以了。
Android消息处理的流程如下:
screenshot.png
主线程的消息循环##
android的主线程ActivityThread,入口方法是main。main当中调用了Looper.prepareMainLooer()来创建主线程的Looper以及消息队列。同时,需要一个handler来传递。这个就是大名鼎鼎的H对象,一个handler。
网友评论