标签:
一. Looper
1. 如何使用Looper?
(1) 定义一个LooperThread.
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare(); // 调用prepare();
Looper.loop(); // 进入消息循环。
}
}
(2) 应用程序中使用LooperThread:
{
new LooperThread().start(); // 启动新线程,线程函数是run.
}
2. Looper.prepare()函数:
public static final void prepare() {
if (sThreadLocal.get() != NULL) {
throw new RuntimeException("Only one Looper may be created per thread");
}
sThreadLocal.set(new Looper()); // 构造一个Looper对象,设置到调用线程的局部变量(TLV)中,将Looper与线程绑定在一起。
}
3. Looper的创建:
private Looper() {
mQueue = new MessageQueue(); // 构造一个消息队列。
mRun = true;
mThread = Thread.currentThread(); // 得到当前线程的Thread对象。
}
由此可见, 在调用prepare线程中,为该线程设置了一个Looper对象,Looper对象内部封装了一个消息队列。
4. Looper.loop()的实现
public static final void loop() {
Looper me = myLooper(); // myLooper()返回保存在调用线程TLV中的Looper对象。
MessageQueue queue = me.mQueue;
while (true) {
Message msg = queue.next();
if (msg != NULL) {
if (msg.target == NULL) { // target类型是Handler类型,若为空,则表示需要退出消息循环。
return;
}
msg.target.dispatchMessage(msg); // 调用该消息的handler, 交给它的dispatchMessage函数处理。
msg.recycle;
}
}
}
5. Looper,Message和Handler的关系:
Looper中有一个Message队列, 存储待处理的message。
Message中有一个Handler, 这个Handler用来处理message.
二. Handler
1. Handler类包含了三个成员:
final MessageQueue mQueue; // 最终都会指向某个Looper的消息队列
final Looper mLooper; // 它的值有可能通过构造函数由外面传进来,有可能通过Looper.myLooper()函数获得调用线程的Looper。
final Callback mCallback; // 作为回调用。
2. Handler提供了一系列用于创建消息和插入消息队列的函数。如发送消息的函数:
public final boolean sendMessage(Message msg) {
return sendMeeageDelayed(msg, 0);
}
public final boolean sendMessageDelayed(Message msg, long delayMillis) { // delayMillis是以当前时间为基础的相对时间
if (delayMillis < 0) {
delayMillis = 0;
}
return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis); // 调用sendMessageAtTime, 把当前时间算上。
}
public final boolean sendMessageAtTime(Message msg, long uptimeMillis) { // uptimeMillis是绝对时间,因此该函数处理的是绝对时间
bool sent = false;
if (mQueue != null) {
msg.target = this; // 将target设为自己,因为Handler还封装了消息处理的接口。
sent = mQueue.enqueueMessage(msg, uptimeMillis);
}
return sent;
}
3. 处理消息的函数dispatchMessage()
public void dispatchMessage(Message msg) {
if (msg.callback != null) { // 如果Message本身有callback, 则直接交给Message的callback处理。
handleCallback(msg);
} else {
if (mCallback != null) { // 若本Handler设置了mCallback, 则交由它处理。
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg); // 最后交给子类处理。
}
}
标签:
原文地址:http://www.cnblogs.com/Jackwen/p/4337571.html