[学习笔记] Handler 初识

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 处理消息
  1. Handler通过send Message或者post去将消息发送到messageQueue
  2. handler的dispatchMessage方法最终会调用handlerMessage方法来处理消息

处理消息.png

  • 消息发送到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;
            }

        }
    };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

法迪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值