Handler是android中线程间交互的一个方法,主要涉及Looper,MessageQueue,Message,Handler四个类。
- 一个线程对应一个Looper,一个Looper拥有一个MessageQueue对象,Looper不断从MessageQueue中取出Message对象,然后执行Message对象对应的响应函数。
- MessageQueue存放Message,使用next()函数取出一个Message,没有Message可取时,会阻塞当前线程。
- Handler在定义的时候,会获取定义它的线程和线程对应的Looper对象(不存在会报错),Handler将Message加入Looper的MessageQueue中。
- Message后持有添加自己的Handler的引用,Looper冲MessageQueue中取出Message会执行对应的Handler的handleMessage函数,这个函数就是我们自己定义的Message响应函数。
1、Looper: android.os.Looper
public final class Looper { //不可有子类
static final ThreadLocalsThreadLocal = new ThreadLocal (); final MessageQueue mQueue;
......
public static void prepare() { prepare(true); } ......
public static void loop() { final Looper me = myLooper(); ...... for (;;) { Message msg = queue.next(); // might block if (msg == null) { return; }
msg.target.dispatchMessage(msg);
} } ......
} Looper对象是和线程关联的,一个线程只能有一个唯一的Looper对象,Looper中维护着一个ThreadLocal对象,用来存放各个线程自己的looper对象。
这里插一下对主线程运行的一个理解:一直知道UI线程是以一个死循环,监听用户和系统的事件,从而做出响应的,这个死循环保证UI线程可以一直存在。而android中UI线程的死循环就是通过Looper的loop方法实现的。在ActivityThread(一个UI线程是从这个类的main函数启动)的main函数中:先初始化当前线程的Looper对象,然后执行其他配置初始化等操作(包括了UI响应相关的Handler),最后执行Looper的loop函数阻塞UI线程等待Handler发送Message。所以我们在android开发中,UI线程中可以直接定义Handler,但是在子线程中,需要自己初始化Looper对象并开始一个循环。
2、MessageQueue android.os.MessageQueue
public final class MessageQueue { ...... Message next() { for(;;){ } } ........ }
一个管理Message的队列。
3、Message
Message是用来传递消息的,Message的target属性持有发送他的Handler对象,所以后面可以使用到这个对象来调用消息的响应函数。
4、Handler
在Handler的多线程交互中,我们接触最多的就是Handler。
1)我们定义自己的Handler:我们实现一个Handler实例的时候,Handler对象都会和实现他的线程的Looper和Looper的MessageQueue关联起来。
2)我们使用Handler:我们在其他线程中,使用定义的Handler对象,发送Message,然后会调用Handler的一系列函数,将Message添加到MessageQueue中,等待Looper的使用。
public class Handler { ...... public void dispatchMessage(Message msg) { Looper中调用改方法消费Message 可能调用msg的callback(一个Runnable的对象) 调用mCallback对象(一个Handler的内部接口有handleMessage方法,有返回值) 调用Handler的handlerMessage方法 if (msg.callback != null) { handleCallback(msg); } else { if (mCallback != null) { if (mCallback.handleMessage(msg)) { return; } } handleMessage(msg); } } ...... private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) { 将Message添加到MessageQueue msg.target = this; if (mAsynchronous) { msg.setAsynchronous(true); } return queue.enqueueMessage(msg, uptimeMillis); }}