转载注明出处:http://blog.csdn.net/xiaohanluo/article/details/51994401
1. 简介
在Android开发中经常会遇见异步消息处理的情况,特别是网络请求成功或者失败之后需要更新UI,但是更新UI只能在UI线程里面进行,否则就会报错,这个时候就需要通知UI线程去更新UI,于是Handler出现了。
2. Handler的使用
Handler的使用非常简单,直接看例子。
private static final int KEY_REQUEST_SUCCESS = 0x01;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
//这里是在UI线程了
if(msg.what == KEY_REQUEST_SUCCESS) {
//更改UI
}
}
};
... ...//一些其他操作
private void changeUI() {
Message message = mHandler.obtainMessage();
message.what = KEY_REQUEST_SUCCESS;
mHandler.sendMessage(message);
}
声明了一个Handler成员变量mHandler,并复写了其中的handleMessage(Message msg)
方法,然后使用mHandler发送一条消息,最终会调用到handleMessage
方法,然后进行UI更新操作。
看见这么好用的异步消息处理方法,肯定会去看看内部是怎么实现消息的调度的。
3. Handler内部信息调度
3.1 消息进入队列
所有的消息都是使用sendMessage
方法发送出去(还有其他类似方法),就从sendMessage
开始查看。
public final boolean sendMessage(Message msg)
{
return sendMessageDelayed(msg, 0);
}
...
public final boolean sendMessageDelayed(Message msg, long delayMillis)
{
if (delayMillis < 0) {
delayMillis = 0;
}
return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
}
...
public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
MessageQueue queue = mQueue;
if (queue == null) {
//异常处理
}
return enqueueMessage(queue, msg, uptimeMillis);
}
...
priv