0. Handler 简介
优秀文章推荐
http://blog.csdn.net/u012827296/article/details/51236614
http://blog.csdn.net/duanmulirui/article/details/68925958
0.1 用途
Handler 是常被开发者拿来更新 UI 的一种消息处理机制。
0.2 为什么使用 Handler
因为Android子线程不能直接操作主线程,故引入 Handler 进行刷新 UI 操作。
因为Android UI线程不是线程安全的,如果多线程并发的话就会造成界面混乱及不可控的状态,故Android子线程不能直接操作主线程。
1. Handle 工作原理
运行机制需要底层的Looper和MessageQueue的支撑
- MessageQueue:消息队列
虽然名为队列,但事实上它的内部存储结构并不是真正的队列,而是采用单链表的数据结构来存储消息列表的,其中主要有插入enqueue()和从中拿走并删除next()两个方法。
- Looper:消息循环
MessageQueue来存储消息,Looper则是以无限循环的方式去查找是否有新消息,如有就去处理,若没有就standby(等待)。
1.1 创建消息
1.2 发送消息
因为ActivityTread创建时就初始化了Looper,所以在UI主线程就能直接使用Handler
1.3 处理消息
- Handler通过send Message或者post去将消息发送到messageQueue
- handler的dispatchMessage方法最终会调用handlerMessage方法来处理消息
- 消息发送到messageQueue
mHandler.sendEmptyMessage(MSG_UPDATE_UNREAD);
- handleMessage 处理消息
private Handler mHandler =null;
private static class MyHandler extends Handler{
WeakReference<SuperPowerManagerActivity> mActivity;
public MyHandler(SuperPowerManagerActivity activity) {
mActivity = new WeakReference<SuperPowerManagerActivity>(activity);
}
public void handleMessage(Message msg) {
SuperPowerManagerActivity activity = mActivity.get();
switch (msg.what) {
case MSG_UPDATE_UNREAD:
activity.updateUnReadInfo();
break;
case MSG_UPDATE_MMS_UNREAD:
activity.mMMS.updateShortcutUnreadNum(PowerSaveDao.getUnreadMessages(activity));
break;
case MSG_UPDATE_CALL_UNREAD:
activity.mDialer.updateShortcutUnreadNum(PowerSaveDao.getUnanswerDail(activity));
break;
case MSG_START_SUPER_MODE:
activity.mLavaPowerSaveManagerHelp.startCommonPowerSaveSettings();
break;
default:
break;
}
}
};