HandlerThread存在的真正意义:一个线程执行多个线程的任务!

HandlerThread不仅用于异步任务和主线程UI更新,它的真正价值在于同一个线程执行多个任务,尤其适用于处理耗时回调。通过示例解释了在相机预览回调中,如何利用HandlerThread保持回调在子线程执行,避免阻塞主线程。文章强调了Looper共享的概念,以及HandlerThread在创建Looper时的角色,展示了其在特定场景下的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:要了解HandlerThread首先我们必须了解Handler消息机制,简单回顾一下Handler机制。大家都知道Handler是通过发送Messege到一个消息队列,然后通过Looper轮询器来取出消息然后处理。处理的方法就是handlerMessegeXXX(方法名大概就是这个)。那么这个处理方法执行的线程取决于什么呢?就是取决于Looper轮询器所在的线程。

本文不仅仅是教你如何使用HandlerThread,并且会告诉你为何要使用它,它的特殊之处在哪里?而不是简单的一个异步任务然后主线程更新UI这么简单。

 

好了进入正题,HandlerThread其实就是一个线程,只不过内部封装了Handler的相关消息处理机制,既然如此那么它首先就使用Looper.prepare();为自己创建了一个Looper,所以看了很多网上的文章都是把HandlerThread作为Asynctask来执行异步任务,主线程刷新的操作,其实这样根本就没必要使用HandlerThread。它真正强大的地方并不是说异步执行,主线程刷新,而是创建一个handlerThread可以执行多个任务。当然这个是有个前提的(我们后文会提到),假如我们有个需求:在子线程开启一个任务,这个任务有个回调也要在子线程执行(为什么会有这样的需求,因为如果回调过来的数据处理起来也是很耗时的,那么就不能在主线程执行)。请问大家会怎么去写:这里我写了一个使用Asynctask的例子,并且通过验证,回调会在主线程。当然我的例子是在前面提到的前提下执行的。

class MyTask extends AsyncTask<Void,Void,Void> implements Camera.PreviewCallback {
        /**
         * 需求:这里要在子线程执行
         * @param voids
         * @return
         */
        @Override
        protected Void doInBackground(Void... voids) {
            Log.i("TAG",Thread.currentThread().getName()+"doInBackground..");
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值