自带光环的HandlerThread

Thread之前说的多了,HandlerThread了解么,今天来说说他和Thread的区别

自带光环的Thread

我们知道要开启一个Thread并绑定给一个Handler的话,必须用Looper启动一个消息队列,大概的代码会像下面这样

Handler workerHandler;
private void initThread() {
    Thread worker = new Thread(){
        @Override
        public void run() {
            super.run();
            Looper.prepare();
            workerHandler = new Handler(Looper.myLooper()){
                @Override
                public void handleMessage(Message msg) {
                    super.handleMessage(msg);
                }
            };
            ....
            Looper.loop();
        }
    };
    worker.start();
}

程序员都比较懒,如果想把Looper的代码给省了,可以用HandlerThread,代码变成这样

private void initThread() {
    HandlerThread worker = new HandlerThread("");
    worker.start();
    Handler workerHandler = new Handler(worker.getLooper()){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
        }
    };
}

我们不用在Thread的run方法里手动的去启动一个Looper,HandlerThread帮我们完成了这部分事情。

实现原理

其实原理很简单,我们看HandlerThread的源码就明白,它重写了run方法,在里面帮我们prepare了Looper

@Override
public void run() {
    mTid = Process.myTid();
    Looper.prepare();
    synchronized (this) {
        mLooper = Looper.myLooper();
        notifyAll();
    }
    Process.setThreadPriority(mPriority);
    onLooperPrepared();
    Looper.loop();
    mTid = -1;
}

需要注意的问题

· HandlerThread的 getLooper是个阻塞方法,在Thread的Looper没准备好之前,是会调用 wait()阻塞当前线程的 · 因为HandlerThread会帮我们启动Looper,因此在我们不需要它的时候,记得一定要调用quit/quitSafely,否则会创建越来越多的线程导致OOM。

原文发布于微信公众号 - Android每日一讲(gh_f053f29083b9)

原文发表时间:2018-03-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Jack的Android之旅

AsyncTask源码深入解析

最近想写一篇关于源码解析的文章,发现AsyncTask代码量不多,可里面的东西却是很值得学习的,所以故那这来“开刀”

922
来自专栏小白安全

微信小程序游戏跳一跳刷分神器

PS:此文需要一定的电脑基础知识的人员,没有基础的请关闭本页,避免不适。玩这个的前提是你的微信升级到了最新版。 相关工具下载: https://develope...

3859
来自专栏田超学前端

【微信小程序】c# 实现获取openid、session_key 服务端

1.6K0
来自专栏三好码农的三亩自留地

Android AsyncTask实现原理和使用技巧分享

我们写App都有一个原则,主线程不能够运行需要占用大量CPU时间片的任务,如大量复杂的浮点运算,较大的磁盘IO操作,网络socket等,这些都会导致我们的主线程...

1673
来自专栏技术小黑屋

详解 Android 中的 HandlerThread

HandlerThread是Android API提供的一个便捷的类,使用它我们可以快速的创建一个带有Looper的线程,有了Looper这个线程,我们又可以生...

1165
来自专栏拭心的安卓进阶之路

Android 进阶15:HandlerThread 使用场景及源码解析

眼睛困得要死,但今天的计划不完成又怎么能睡呢?明日复明日,明日何其多啊! 为了避免 ANR,我们常常需要在线程中做耗时操作,然后把结果抛到主线程进行处理。 An...

41110
来自专栏xingoo, 一个梦想做发明家的程序员

链表的有序插入

从小到大排序 根据指针获取当前id,并设置前指针,方便操作: // test1107.cpp : 定义控制台应用程序的入口点。 // #include "st...

1907
来自专栏CodingBlock

Android查缺补漏(线程篇)-- AsyncTask的使用及原理详细分析

本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8515304.html

773
来自专栏CodingBlock

Android查缺补漏(线程篇)-- AsyncTask的使用及原理详细分析

本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8515304.html

812
来自专栏刘望舒

AsyncTask源码解析

导语 AsyncTask对Android开发者来说并不陌生,当有耗时任务并涉及UI交互,AsyncTask可是处理异步任务的利器。AsyncTask使用也很方...

2215

扫码关注云+社区

领取腾讯云代金券