HanderThread基本使用以及内部实现原理

319 篇文章 17 订阅
46 篇文章 2 订阅

作者:长安皈故里

本篇文章主要是讲解HanderThread基本使用以及内部实现原理,读者需要对Android的消息机制有一定的知识基础。

HanderThread基本使用

fun hdUse() {
    val handlerThread = HandlerThread("ChapterActivity", 100)
    handlerThread.start()

    val handler = Handler(handlerThread.looper) { msg ->
        if (msg.what == 5) {
            //执行代码逻辑
        }
        true
    }
    handler.sendEmptyMessage(5)
}
  1. 首先创建HandlerThread,构造方法的第一个参数代表线程名,第二个参数代表线程的优先级,待会原理分析会讲
  2. 调用HandlerThreadstart方法,一定要在getLooper方法调用前调用
  3. 创建Handler,并传入HandlerThread的looper
  4. 之后就可以通过上一步创建的Handler发送并处理Message

HanderThread搭配协程

kotlinx-coroutines-android-1.4.1依赖中提供了一个扩展方法Handler.asCoroutineDispatcher,创建一个协程上下文元素——CoroutineDispatcher

val dispatch = handler.asCoroutineDispatcher()
lifecycleScope.launch(dispatch) { 
}

最终协程块中逻辑会被包装成一个Message,添加到handler持有的looper的消息队列中,最终handler持有的looper在哪个线程中创建的,协程块就会在哪个线程中执行。

#HandlerContext

HanderThread原理分析

HandlerThread继承于Thread,说明其就是创建了一个线程对象。到了这里就可以明白为什么HanderThread的构造方法为什么会传入线程名称和线程优先级了。

public class HandlerThread extends Thread

紧接着,之后调用HandlerThreadstart方法,也就是说开启了线程执行,就会执行线程的run方法:

  1. 调用Looper.prepare方法创建该线程独有的Looper
  2. 设置当前线程的优先级
  3. 调用Looper.loop()开启for循环,不断的从消息队列获取Message并在当前线程执行

所以说,上面通过HandlerThread创建的handler发送的message最终执行在HandlerThread这个创建的线程中。

HanderThread案例讲解

大家都知道,Service中不能执行耗时操作,否则会被埋的炸弹爆炸直接ANR。所以官方提供了一个IntentService,来实现在Service中执行耗时操作。

public abstract class IntentService extends Service

核心代码在onCreate中: #IntentService

看着是不是很熟悉,本质上就是利用HandlerThread实现的。不过,目前这个IntentService已经被标记为废弃了,系统推荐我们使用:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值