广告
返回顶部
首页 > 资讯 > 移动开发 >Android HandlerThread案例详解
  • 360
分享到

Android HandlerThread案例详解

2024-04-02 19:04:59 360人浏览 八月长安
摘要

HandlerThread 顾名思义就是一种可以使用 Handler 的 Thread。日常开发中我们经常会通过创建一个 Thread 去执行任务,有多个任务就多创建几个线程实现,这

HandlerThread 顾名思义就是一种可以使用 Handler 的 Thread。日常开发中我们经常会通过创建一个 Thread 去执行任务,有多个任务就多创建几个线程实现,这时候可能出现线程同步的问题。不过有时候我们并不需要很强的并发性,只需保证按照顺序地执行各个任务即可,有什么好办法实现呢?第一反应想到的可能是通过 Executors.newSingleThreadExecutor() 方法来创建一个 SingleThreadExecutor,来统一所有的任务到一个线程中,然后按顺序执行。其实,除了这个方法之外,HandlerThread 也可以实现。

简单使用

首先创建一个 HandlerThreadActivity


public class HandlerThreadActivity extends BaseActivity {
    
    private static final String TAG = "HandlerThreadActivity";

    private Button mStartBtn;
    private Handler mHandler;
    private HandlerThread mHandlerThread;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_handler_thread);
        mStartBtn = findViewById(R.id.start_btn);

        mHandlerThread = new HandlerThread("THREAD_NAME");
        mHandlerThread.start();
        mHandler = new Handler(mHandlerThread.getLooper());

        mStartBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        Log.d(TAG, Thread.currentThread().getId() + " " + String.valueOf((Looper.myLooper() == Looper.getMainLooper())) + " 任务:" + this.hashCode());
                        SystemClock.sleep(3000);
                    }
                });
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mHandlerThread.quit();
    }
}

快速三击按钮,打印日志如下:

可以发现,三次不同的任务按开始的顺序执行,而且是运行在子线程中,那到底是怎么实现的呢?

源码解析


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;
    }
    
   
    public HandlerThread(String name, int priority) {
        super(name);
        mPriority = priority;
    }
    
   
    protected void onLooperPrepared() {
    }

    @Override
    public void run() {
        // 获取线程 id
        mTid = Process.myTid();
        //构建一个 Looper
        Looper.prepare();
        synchronized (this) {
            mLooper = Looper.myLooper();
            notifyAll();
        }
        //设置线程优先级
        Process.setThreadPriority(mPriority);
        onLooperPrepared();
        Looper.loop();
        // Looper 循环
        mTid = -1;
    }
    
     // 获取当前线程的 Looper,
    public Looper getLooper() {
        if (!isAlive()) {
            return null;
        }
       
        synchronized (this) {
            while (isAlive() && mLooper == null) {
                try {
                    wait();
                } catch (InterruptedException e) {
                }
            }
        }
        return mLooper;
    }


     
    @NonNull
    public Handler getThreadHandler() {
        if (mHandler == null) {
            mHandler = new Handler(getLooper());
        }
        return mHandler;
    }

     //线程退出方法,主要是调用 Looper.quit() 方法,不然一直在循环
    public boolean quit() {
        Looper looper = getLooper();
        if (looper != null) {
            looper.quit();
            return true;
        }
        return false;
    }

    //同上,不过这个方法会把消息队列中的已有消息处理完才会安全地退出
    public boolean quitSafely() {
        Looper looper = getLooper();
        if (looper != null) {
            looper.quitSafely();
            return true;
        }
        return false;
    }

    public int getThreadId() {
        return mTid;
    }
}

通读下来,如果熟悉 Handler 原理的同学大概就明白 HandlerThread 的机制了:

  • HandlerThread 运行 start() 方法,回调 run() 方法。
  • 在 run() 方法中通过 Looper.prepare() 来创建消息队列,并通过 Looper.looper() 方法来开启消息循环。
  • 由于 Loop.loop() 是一个死循环,导致 run() 也是无线循环,因此当我们不需要使用 HandlerThread 的时候,要调用它的 quit() 方法或者 quiteSafely() 方法。

到此这篇关于Android HandlerThread案例详解的文章就介绍到这了,更多相关Android HandlerThread内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Android HandlerThread案例详解

本文链接: https://www.lsjlt.com/news/132844.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android HandlerThread案例详解
    HandlerThread 顾名思义就是一种可以使用 Handler 的 Thread。日常开发中我们经常会通过创建一个 Thread 去执行任务,有多个任务就多创建几个线程实现,这...
    99+
    2022-11-12
  • Android HandlerThread使用方法详解
    Android HandlerThread使用方法详解HandlerThread 继承自Thread,内部封装了Looper。首先Handler和HandlerThread的主要区别是:Handler与Activity在同一个线程中,Han...
    99+
    2023-05-30
    android handlerthread roi
  • Android HandlerThread的使用及原理详解
    一、HandlerThread的含义 HandlerThread能够新建拥有Looper的线程。这个Looper能够用来新建其他的Handler。(线程中的Looper)需要...
    99+
    2022-06-06
    handlerthread Android
  • Android之AttributeSet案例详解
    public interface AttributeSet { public int getAttributeCount(); public...
    99+
    2022-11-12
  • Android Intent与IntentFilter案例详解
    1. 前言        在Android中有四大组件,这些组件中有三个组件与Intent相关,可见Intent在Android整个生态中的地...
    99+
    2022-11-12
  • Android ActivityManager使用案例详解
    前言 Activity可以获取运行中的应用信息,可以获取到servcie,process,app,memory,Task信息等。 获取信息 ActivityManager....
    99+
    2022-11-12
  • Android Handler使用案例详解
    什么是Handler? Handler可以发送和处理消息对象或Runnable对象,这些消息对象和Runnable对象与一个线程相关联。每个Handler的实例都关联了一个线程和线程...
    99+
    2022-11-12
  • Android VelocityTracker使用案例详解
       VelocityTracker顾名思义即速度跟踪,在android中主要应用于touch even。VelocityTracker通过跟踪一连串事件实时计算...
    99+
    2022-11-12
  • Android GridLayout使用案例详解
    目录一、简介二、常用属性介绍三、平分问题四、小米计算器效果五、动态加载一、简介 GridLayout是Android4.0引入的网格布局,使用它可以减少布局嵌套。也算是常用,但一直没...
    99+
    2022-11-12
  • Android LayoutParams使用案例详解
    LayoutParams是什么? LayoutParams主要保存了一个View的布局参数,因此可以使用LayoutParams来改变布局参数从而达到View位置的效果,一般在自定义...
    99+
    2022-11-12
  • Android banner详解用法案例
    Android----banner使用详解 昨天10.31 ,斗破苍穹的三年之约终于出来了,自己也等了很久很久,敬师长,敬家人,敬朋友,敬每一个前行路上正在奋战的自己,星光不问赶路...
    99+
    2022-11-12
  • android使用handlerthread创建线程示例
    在android开发中,一说起线程的使用,很多人马上想到new Thread(){...}.start()这种方式。这样使用当然可以,但是多次使用这种方式,会创建多个匿名线程。...
    99+
    2022-06-06
    示例 handlerthread 线程 Android
  • Android BadTokenException异常解决案例详解
    目录解决办法1解决方法2总结 线上出现了如上的 crash,第一解决反应是在 show dialog 之前做个 isFinish 和 isDestroyed 判断,当我翻开代码正要解...
    99+
    2022-11-12
  • Android Kotlin使用SQLite案例详解
    Kotlin使用SQLite 首先确定我们的目标,SQLite只是一种工具,我们需要掌握就是增删改查就可以,我们真正需要动脑的还是项目中的业务逻辑。我这篇文章写得比较适合新手,没用过...
    99+
    2022-11-12
  • 了解Android核心:Looper,Handler和HandlerThread
      Android中的主线程由 looper 和 Handlers 组成。所以了解创建无阻碍的响应式 UI 很重要。 MessageQueue 是一个队列,其中包含消息任务...
    99+
    2022-06-06
    handlerthread looper handler Android
  • Android Location服务之LocationManager案例详解
    上次介绍了位置服务中的Geocoder,这次就来介绍一下LocationManager。LocationManager系统服务是位置服务的核心组件,它提供了一系列方法来处理与位置相关...
    99+
    2022-11-12
  • Android mvvm之LiveData原理案例详解
    1. 生命周期感知 1.1 生命周期感知组件 我们知道,Controller(Activity or Fragment) 都是有生命周期的,但是传统的 Controller 实现方式...
    99+
    2022-11-12
  • Android TextView的TextWatcher使用案例详解
    TextWatcher是一个文本变化监听接口,定义了三个接口,分别是beforeTextChanged,onTextChanged,afterTextCahnged. TextWa...
    99+
    2022-11-12
  • Android 启动模式FLAG_ACTIVITY_CLEAR_TOP案例详解
    四种启动模式 standard: 只要被启动就会创建一个新的 singleTop: 栈顶复用(当被启动的Activity处于Task栈顶时,可以复用,直接调用o...
    99+
    2022-11-12
  • Android ExpandableListView使用方法案例详解
    目录一、前言二、实现的功能三、具体代码1、主xml代码2、父布局xml代码3、子布局xml代码4、主activity代码5、adapter代码一、前言   “好记性不如烂笔...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作