稀土掘金 稀土掘金

Looper、Message、Handler 和HandlerThread 之间的关系

Android 中,使用 AsyncTask 来执行简单的后台线程,但是 AsyncTask 较适用于短暂的、不重复的运行任务。因为从 Android 3.2 起,AsyncTask 不再为每个实例创建线程,而是利用一个 Executor 在单一的后台线程上运行所有的 AsyncTask 后台任务,相当于所有的 AsyncTask 实例在同一个队列中排队运行,所以长时间且重复运行的 AsyncTask 会影响其他实例的运行,导致堵塞。实现按需下载的等后台运行方式,通常会使用到 HandlerThread。

消息

首先介绍一下消息(Message),消息是 Message 类的实例,携带着需要处理的各种任务信息。有以下几个常见变量:

  1.  what:用户定义的 int 型消息代码,用来描述和识别信息;

  2.  obj:随消息发送的用户指定对象;

  3.  target:处理消息的 Handler,创建 Message 时会自动与一个 Handler 关联,通常不用手动设置;

  4.  arg1、arg2:随消息返回的两个 int 类型参数。

Handler

Handler 作为 Message 的目标,除了用来触发 message 的处理事件,也是创建和发布 Message 的接口。message 是 在Handler.handleMessage(Message) 方法中进行处理的。

Looper 和 Message、Handler 的关系

Android 的消息循环(message loop)由线程和 looper 组成。Looper 对象管理着消息队列(meesage queue),消息队列中存放着许多的消息(message),它们与 handler 相关联。为了与 Looper 协同工作,Handler 总是引用着 Looper。**主进程本身就是一个拥有 handler 和 Looper 的消息循环,**在主线程中 Android 默认已经调用了 Looper.prepare() 方法,调用该方法的目的是在 Looper 中创建 MessageQueue 成员变量并把 Looper 对象绑定到当前线程中。

  • 一个 Message 只和一个目标 Handler 相关联,但是多个 Message 能引用同一个目标Handler。

**
**

  • 一个 Handler 只和一个 Looper 相关联,但是多个 Handler 可以与一个 Looper 相关联。所以消息队列中可能存放着来自不同 Handler 的 Message。(如下图二)

创建 Message 并关联 Handler

如果有一个类继承了 HandlerThread,那么 Handler 可以在函数 onLooperPrepared() 中新建,因为该函数是在 Looper 首次检查消息队列之前调用的。一般会在 new 一个 Handler 的同时覆写其 handleMessage(Message) 方法。

Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        switch (msg.what) {
            //TODO
        }
    }
};

消息的发送可以有以下几种:

  • 使用 Handler.obtainMessage(Message) 方法来创建信息,此时可以将消息自动设置目标为该 Handler 对象,取得 Message 之后可以使用 sendToTarget 发送给 Handler。Handler 会把该 Message 放置在 MessageQueue 消息队列尾部

    Message mMessage = mHandler.obtainMessage(...); mMessage.sendToTarget();

  • 使用 Handler.sendMessage(Message) 方法:

    mHandler.sendMessage(message);

  • 也可以使用 Handler.post(Runnable) 方式来发送消息:

    mHandler.post(new Runnable() { @Override public void run() { //TODO } });

看看源码会发现它是把 Runnable 转换成了一条空的 message,设置它的私有变量 callback 为我们传入的 Runnable,然后再调用 sendMessageDelayed(Message) 方法的。

当 message 设有回调方法时,它从消息队列取出后,是不会发给 target Handler 的,而是直接执行存储在 callback 中的 Runnable 的 run() 方法。

玻璃钢生产厂家惠州玻璃钢雕塑制品光山玻璃钢雕塑费用甘肃彩色玻璃钢雕塑定制嘉峪关卡通玻璃钢雕塑价格玻璃钢种植池玻璃钢雕塑摆件公仔玻璃钢仿真马桶雕塑成品玻璃钢雕塑摆件费用陕西人物玻璃钢雕塑市场达州玻璃钢海豚雕塑蒙城商场美陈布展哪有玻璃钢雕塑加工延安公园玻璃钢雕塑安装四会玻璃钢机器人雕塑价格四川商场美陈有哪些深圳大型商场美陈市场报价管城区博物馆玻璃钢雕塑温州商场美陈生产厂家玻璃钢花盆在哪里的连云港盐城玻璃钢雕塑重庆人物玻璃钢雕塑制作广场玻璃钢彩绘雕塑定制厂家玻璃钢酿酒文化雕塑长沙欧式玻璃钢雕塑供应商南阳不锈钢景观玻璃钢彩绘雕塑河南秋季商场美陈有哪些玻璃钢浮雕城市雕塑制作厂家江苏大型商场创意商业美陈步骤卡通人玻璃钢雕塑摆件研发园林玻璃钢动物雕塑包括哪些香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化