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

HandlerThread解析

作者头像
用户1205080
发布2019-04-25 15:06:39
1.1K0
发布2019-04-25 15:06:39
举报
文章被收录于专栏:编码前线

概述

HandlerThread是一个包含 Looper的Thread,通过这个Looper可以创建Handler,所以被称为HandlerThread。

使用

代码语言:javascript
复制
HandlerThread handlerThread = new HandlerThread("handler-thread");handlerThread.start(); // 必须在Handler创建前调用,因为线程start后才会创建LooperHandler threadHandler = new Handler(handlerThread.getLooper()) {    @Override    public void handleMessage(Message msg) {        super.handleMessage(msg);        // 处理消息,因为这个方法是在子线程调用,所以可以在这执行耗时任务    }};

实现原理

如果没有HandlerThread,我们在子线程中创建Handler,需要这么操作:

代码语言:javascript
复制
Handler threadHandler;new Thread(new Runnable() {    @Override    public void run() {        Looper.prepare();        threadHandler = new Handler(Looper.myLooper()) {            @Override            public void handleMessage(Message msg) {                super.handleMessage(msg);                // 处理消息            }        };        Looper.loop();    }}).start();

显然步骤比HandlerThread多了好几步,那么接下来我们来看看HandlerThread的实现原理。

代码语言:javascript
复制
public class HandlerThread extends Thread {    int mPriority;    int mTid = -1;    Looper mLooper;    private @Nullable Handler mHandler;    public HandlerThread(String name) {        super(name);        mPriority = Process.THREAD_PRIORITY_DEFAULT;    }    // ...    @Override    public void run() {        mTid = Process.myTid();        Looper.prepare();        synchronized (this) {            mLooper = Looper.myLooper();            notifyAll();        }        // 设置线程优先级,因为HandlerThread是作为工作线程,所有可以根据就要降低其优先级        Process.setThreadPriority(mPriority);        onLooperPrepared();        Looper.loop();        mTid = -1;    }    // ...}

分析:在HandlerThread的run方法中,会调用 Looper.prepare()来进行当前线程Looper的初始化,并调用 Looper.loop()方法来启动Looper循环。由此可见,HandlerThread只是替我们做了这两步操作。

使用场景

HandlerThread所做的就是在新开的子线程中创建Looper,所以它的使用场景就是Thread + Looper使用场景的结合,即: 在子线程中执行耗时,多任务的操作。 HandlerThread的特点: 单线程串行执行任务

可以使用HandlerThread来处理本地IO读写操作(数据库、文件),因为本地IO操作大多数耗时属于毫秒级别,对于单线程 + 异步队列的形式不会产生较大的阻塞。因此不适合处理网络IO操作。

优缺点

优点:只要开启一个线程,就可以处理多个耗时任务。

缺点:任务是串行执行的,不能并行执行。一旦队列中有某个任务执行时间过长,就会导致后续的任务都会被延迟处理。

注意事项

  1. HandlerThread不再需要使用的时候,要调用 quitSafe()或者 quit()方法来结束线程。
  2. quitSafe()会等待正在处理的消息处理完后再退出,而 quit()不管是否正在处理消息,直接移除所有回调。

参考链接

  1. [HandlerThread详解]https://lrh1993.gitbooks.io/androidinterviewguide/content/android/basis/HandlerThread.html
  2. [详解 Android 中的 HandlerThread]https://droidyue.com/blog/2015/11/08/make-use-of-handlerthread/
  3. [HandlerThread]https://developer.android.com/reference/android/os/HandlerThread.html
  4. [Android多线程:这是一份详细的HandlerThread源码分析攻略]https://www.jianshu.com/p/4a8dc2f50ae6
  5. [Android HandlerThread使用总结]https://waylenw.github.io/Android/android-handler-thread-usage/
  6. [HandlerThread 使用场景及源码解析]https://blog.csdn.net/u011240877/article/details/72905631
  7. [Android HandlerThread 总结使用]https://www.cnblogs.com/zhaoyanjun/p/6062880.html
  8. [Handler vs Timer]https://androidtrainningcenter.blogspot.com/2013/12/handler-vs-timer-fixed-period-execution.html
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编码前线 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 使用
  • 实现原理
  • 使用场景
  • 优缺点
  • 注意事项
  • 参考链接
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档