内容概述
作者:长安皈故里本篇文章主要是讲解HanderThread基本使用以及内部实现原理,读者需要对Android的消息机制有一定的知识基础。HanderThread基本使用fun hdUse() { val handlerThread = HandlerThread("ChapterActivity", 100) handlerThread.start() val handler = Handler(handlerThread.looper) { msg -> .
语音解读
图文解释
作者:长安皈故里
本篇文章主要是讲解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)
}
- 首先创建
HandlerThread
,构造方法的第一个参数代表线程名,第二个参数代表线程的优先级,待会原理分析会讲 - 调用
HandlerThread
的start
方法,一定要在getLooper
方法调用前调用 - 创建
Handler
,并传入HandlerThread
的looper - 之后就可以通过上一步创建的
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
紧接着,之后调用HandlerThread
的start
方法,也就是说开启了线程执行,就会执行线程的run
方法:
所以说,上面通过HandlerThread
创建的handler
发送的message
最终执行在HandlerThread
这个创建的线程中。
HanderThread
案例讲解
大家都知道,Service
中不能执行耗时操作,否则会被埋的炸弹
爆炸直接ANR。所以官方提供了一个IntentService
,来实现在Service中执行耗时操作。
public abstract class IntentService extends Service
核心代码在onCreate
中: #IntentService
看着是不是很熟悉,本质上就是利用HandlerThread
实现的。不过,目前这个IntentService
已经被标记为废弃了,系统推荐我们使用:
总结
以上是编程之家为你收集整理的HanderThread基本使用以及内部实现原理全部内容。
如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给好友。
原文地址:https://blog.csdn.net/weixin_61845324