kotlin协程理解
初步认知
- kotlin协程是一个线程库;替代方案有:AsyncTask、Handler+线程池、RxJava
- 和其他方案相比kotlin协程的优势:
- 轻量:其他的多任务异步方案的最小单位是线程,协程是在线程之上的,可以共享线程,最大程度的复用,消耗少量的资源可以创建大量的协程
- 便于管理控制:支持协程取消和结构性并发,统一作用域管理
为什么要使用kotlin中协程
- 先来看看不用协程,实现网络加载一个列表数据异步任务
private fun loadData1() {
loadListData1 {
runOnUiThread {
show.text = it.toString();
}
}
}
private fun loadListData1(callback: (dataList: List<String>) -> Unit) {
Thread {
Thread.sleep(2000)//模拟网络耗时
callback.invoke(mutableListOf<String>().apply {
add("item1")
add("item2")
add("item3")
})
}.start()
}
可以看到主业务逻辑代码有两层嵌套(使用java 嵌套会更多),单个简单的业务请求还不是很明显,如果业务复杂,回调地狱就很明显,不好维护
2. 使用kotlin协程来实现
var mainScope = MainScope();
private fun loadData2() {
mainScope.launch {
val loadListData = loadListData2()
show.text = loadListData.toString();
}
}
private suspend fun loadListData2(): List<String> = withContext(Dispatchers.IO) {
Thread.sleep(2000)//模拟网络耗时
mutableListOf<String>().apply {
add("item1")
add("item2")
add("item3")
}
}
可以看到使用kotlin协程实现的代码,主业务逻辑代码很清晰,相当于写单任务的同步代码
kotlin中协程中有什么
kotlin协程中类
类/接口 | 作用 |
---|---|
CoroutineScope | 它是协程的作用域,用于控制协程的生命周期 |
CombinedContext | 提供协程启动和运行时需要的信息 |
Dispatchers | 指定协程运行的线程(IO、Default、Main、Unconfined) |
CoroutineStart | 指定协程的启动模式,它是一个枚举值,默认是立即启动,也通过指定CoroutineStart.LAZY变为延迟启动 ,延迟启动需要你主动调用返回的Job对象的start方法后协程才会启动 |
Android 中怎么使用协程
通过自定义CoroutineScope,可以在应用程序的某一个层次开启或者控制协程的生命周期,例如Android,在ViewModel和Lifecycle类的生命周期里提供了CoroutineScope,分别是ViewModelScope和LifecycleScope.