美文网首页
HandlerThread 你真的用对了吗?

HandlerThread 你真的用对了吗?

作者: 王晨彦 | 来源:发表于2018-08-17 17:36 被阅读482次

前言

在 Android 中我们经常要处理一些耗时任务,为了避免界面卡顿,我们通常使用线程来完成这些工作,但是线程多了会浪费资源,甚至造成 OOM,详情可参考 Android 创建线程源码与OOM分析,我们很容易想到使用线程池来重复利用线程。

但是有时我们的任务需要同时只能执行一个,举个栗子

我们要写一个视频播放器,如果在主线程中操作 MediaPlayer 会导致界面不流畅,这时就需要在后台线程中处理,而且同时只能有一个线程操作 MediaPlayer,不然就可能出问题。

有人说,用 SingleThreadPool 不就好了,的确可以使用单线程的线程池,但是其实我们有更轻量的选择,没错,使用 HandlerThread,今天我们的主角就是它。

HandlerThread 原理

HandlerThread 的用法大家肯定已经很熟悉了,本文也不是为了介绍 HandlerThread 的使用方法。

HandlerThread handlerThread = new HandlerThread("name");
handlerThread.start();
Handler handler = new Handler(handlerThread.getLooper());

HandlerThread 继承自 Thread,那么它和我们熟知的 Thread 有何不同呢?

我们知道普通的 Thread 在 run 方法执行完就会进入终止状态,而 HandlerThread 复写了 start 方法,在 start 时创建了 Looper,并开启了 loop 循环

@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().quit() 跳出 loop 循环。

HandlerThread 踩坑

前段时间项目中需要实现一个视频播放器,对于 MediaPlayer 的操作通过 HandlerThread 完成,每次 new 一个播放器都会启动一个 HandlerThread,而播放器销毁时并没有停止 HandlerThread。我们 APP 中访问量最大的商品详情页也使用了这个播放器,上线后发现APP的线程数量增加了很多,仔细一看,发现有很多名为 VideoPlayer 的线程,恍然大悟。

还好没有引发严重的问题,不过线程数量过多也会造成 OOM,存在很大的风险,所以快马加鞭发补丁修复问题。

回想起来,原来自己一直都没有注意到 HandlerThread 需要手动停止,为了加深记忆,发文以记录。

结语

今天是七夕节,不知道大家是不是都在陪妹子对酒赏月,反正杭州的台风还没走,哈哈

相关文章

  • HandlerThread 你真的用对了吗?

    前言 在 Android 中我们经常要处理一些耗时任务,为了避免界面卡顿,我们通常使用线程来完成这些工作,但是线程...

  • IntentService源码解析

    前几篇文章带领大家对HandlerThread的用法及原理进行了深入探索,为了巩固大家对HandlerThread...

  • 你用对牙膏了吗?

    牙膏作为日常生活常用的清洁用品,有着很悠久的历史。随着科学技术的不断发展,工艺装备的不断改进和完善,各种类型的牙膏...

  • 你用对思维了吗?

    我们知道大学学的是思维、方法,而不是知识。或许毕业后很对知识都忘光了,可是思考问题的维度以及采取解决问题的方法依旧...

  • 你用对synchronized了吗

    最近遇到一个crash问题,是关于线程同步锁的,检查代码的时候发现方法已经使用synchronized同步了,为什...

  • 你用对逻辑了吗?

    人类究竟是怎么了,竟会把胡言乱语也当成妙笔生花?——塔勒布 先说一个看起来不太相关,实际非常值得深思的话题。 19...

  • 学习,我们真的用对力了吗?

    今天一早醒来,拿起手机就点开了“鲸打卡”小程序,前两天,我刚加入了一个消灭囤课的打卡群,每天我们都会打卡,将自己对...

  • Handler学习(2)

    HandlerThread 使用场景:创建一个子线程用于处理耗时操作,创建完HandlerThread后可以用ge...

  • 3分钟让你清楚HandlerThread和IntentServi

    HandlerThread概述 HandlerThread是Thread的子类,但是HandlerThread可以...

  • 3.3异步消息处理机制-HandlerThread

    HandlerThread handlerThread是什么 handlerThread源码解析 1.handle...

网友评论

      本文标题:HandlerThread 你真的用对了吗?

      本文链接:https://www.haomeiwen.com/subject/jbytiftx.html