HandlerThread的使用

Android  2020年7月2日 pm12:08发布4年前 (2020)更新 91es.com站长
104 0 0

HandlerThread简介

HandlerThread是一个Android已封装好的轻量级的异步类。

HandlerThread 继承Thread,本质就是个Thread,与普通Thread 的区别在于实现了自己的Looper,可以单独分发和处理消息。

作用:

用来线程间的消息传递,主要是子线程和子线程间的通信,处理一些简单耗时的操作。

代码片段

public class TestMainActivity extends AppCompatActivity {

    private String TAG = "Test_" + getClass().getSimpleName();

    private HandlerThread mHandlerThread = null;
    private Handler mThreadHandler = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate: ");
        setContentView(R.layout.activity_main);

        // 第一步
        mHandlerThread = new HandlerThread(getClass().getSimpleName());

        //第二步
        mHandlerThread.start();

        //第三步
        mThreadHandler = new Handler(mHandlerThread.getLooper(), callback);
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy: ");

        //第四步
        if (null != mThreadHandler) {
            mThreadHandler.removeCallbacksAndMessages(null);
            mThreadHandler = null;
        }
        if (null != mHandlerThread) {
            //mHandlerThread.quitSafely();
            mHandlerThread.quit();
            mHandlerThread = null;
        }

    }

    private Handler.Callback callback = new Handler.Callback() {
        @Override
        public boolean handleMessage(@NonNull Message msg) {

            //可以处理耗时操作任务,IO操作就不建议了
            //如果通知UI线程更新,可以使用UI线程的Handler或者runOnUiThread()

            return false;
        }
    };
}

HandlerThread源码简介

第一步

HandlerThread变量的初始化

// 第一步
mHandlerThread = new HandlerThread(getClass().getSimpleName());

传入当前类名作为flag。

public class HandlerThread extends Thread {
        int mPriority; //线程优先级
        int mTid = -1;
        Looper mLooper; //当前线程的Looper对象
        private @Nullable Handler mHandler; // Handler对象

        //只带有flag标签参数的构造函数
        public HandlerThread(String name) {
            super(name);
            mPriority = Process.THREAD_PRIORITY_DEFAULT;
        }
        //带有flag标签和线程优先级参数的构造函数
        public HandlerThread(String name, int priority) {
            super(name);
            mPriority = priority;
        }
        ......
    }

通过看源码,除了可以传入类名作为flag之外,还可以传入线程优先级。

第二步

HandlerThread的启动

//第二步
mHandlerThread.start();

为啥要先启动HandlerThread呢?我们看源码run()那部分。

    protected void onLooperPrepared() {
    }

    @Override
    public void run() {
        mTid = Process.myTid();
        //Looper的初始化,构建消息队列等
        Looper.prepare();
        synchronized (this) {
            //获取当前线程的Looper对象
            mLooper = Looper.myLooper();
            //这里用synchronized锁住了,通过notifyAll通知锁住的对象
            notifyAll();
        }
        //设置线程优先级
        Process.setThreadPriority(mPriority);
        //此方法是空的,作用是在线程循环是做一些初始化啥的
        onLooperPrepared();
        //使消息循环
        Looper.loop();
        //只有退出循环后才会执行到这里的。
        mTid = -1;
    }

从上面代码中看出,Looper是在HandlerThread的run()方法中初始化的。

第三步
//第三步
mThreadHandler = new Handler(mHandlerThread.getLooper(), callback);

获取HandlerThread中创建的Looper对象(上面run()方法中初始化的)

callback中用于消息的处理

第四步
 //第四步
 if (null != mThreadHandler) {
     mThreadHandler.removeCallbacksAndMessages(null);
     mThreadHandler = null;
 }
 if (null != mHandlerThread) {
     //mHandlerThread.quitSafely();
     mHandlerThread.quit();
     mHandlerThread = null;
 }

退出时,清空队列中的消息,退出HandlerThread。

参考文章

  1. 《(Android-HandlerThread使用及源码分析)[https://www.jianshu.com/p/884bfe380dba]》
  2. 《(Android HandlerThread)[https://www.jianshu.com/p/e4f202a9e83b]》
  3. 《Android源码HandlerThread.java》

 历史上的今天

  1. 2023: jaudiotagger解析ID3第三版(0条评论)
  2. 2021: 周国平:心静是一种境界(0条评论)
  3. 2019: 戴望舒:雨巷(0条评论)
  4. 2019: 海子:面朝大海,春暖花开(0条评论)
  5. 2019: 史铁生:秋天的怀念(0条评论)
版权声明 1、 本站名称: 91易搜
2、 本站网址: 91es.com3xcn.com
3、 本站内容: 部分来源于网络,仅供学习和参考,若侵权请留言
3、 本站申明: 个人流水账日记,内容并不保证有效

暂无评论

暂无评论...

随机推荐

BiuImageView的使用

前言BiuImageView是之前山寨PhotoView 《自定义View:山寨PhotoView》基础上重构的一个新版本《自定义View:BiuImageView》,也优化了很多。今天就简单的用一下BiuImageView。正文什么是BiuImageView我们知道有个开源的Basef...

Java反射机制及IoC原理

这篇讲解的不错,摘抄于此。感谢《Java反射机制及IoC原理》一. 反射机制概念主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息。反...

叶芝 : 当你老了

当你老了,头白了,睡意昏沉, 炉火旁打盹,请取下这部诗歌, 慢慢读,回想你过去眼神的柔和, 回想它们昔日浓重的阴影; 多少人爱你青春欢畅的时辰, 爱慕你的美丽,假意或真心, 只有一个人爱你那朝圣者的灵魂, 爱你衰老了的脸上痛苦的皱纹; 垂下头来,在红光闪耀的炉...

[NDK开发]Android JNI开发之动态注册

前言我们第一篇文章 《[NDK开发]Android JNI 开发之第一个 JNI实例》就是静态注册的。除了有静态注册,还有动态注册。静态注册静态注册:先由Java得到本地方法的声明,然后再通过JNI实现该声明方法。优点: 理解和使用方式简单, 属于傻瓜式操作, 使用相关工具按流程操作就...

[摘]字符乱码之特征

前言开发中,遇见乱码是难免的,看到网上有大牛整理的《字符乱码之特征》,因此摘抄于此,方便自己查阅。好记性不如烂笔头正文这里有介绍古文码、口字码、符号码、拼音码、问句码、锟拷码参考文章《字符乱码之特征》

食指:相信未来

当蜘蛛网无情地查封了我的炉台当灰烬的余烟叹息着贫困的悲哀我依然固执地铺平失望的灰烬用美丽的雪花写下:相信未来 当我的紫葡萄化为深秋的露水当我的鲜花依偎在别人的情怀我依然固执地用凝霜的枯藤在凄凉的大地上写下:相信未来 我要用手指那涌向天边的排浪我要用手掌那托...