前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >自带光环的HandlerThread

自带光环的HandlerThread

作者头像
PhoenixZheng
发布2018-08-07 16:46:25
4620
发布2018-08-07 16:46:25
举报

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

自带光环的Thread

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

代码语言:javascript
复制
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,代码变成这样

代码语言:javascript
复制
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

代码语言:javascript
复制
@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。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-03-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Android每日一讲 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 自带光环的Thread
  • 实现原理
  • 需要注意的问题
相关产品与服务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档