kotlin协程理解

初步认知

  1. kotlin协程是一个线程库;替代方案有:AsyncTask、Handler+线程池、RxJava
  2. 和其他方案相比kotlin协程的优势:
  • 轻量:其他的多任务异步方案的最小单位是线程,协程是在线程之上的,可以共享线程,最大程度的复用,消耗少量的资源可以创建大量的协程
  • 便于管理控制:支持协程取消和结构性并发,统一作用域管理

为什么要使用kotlin中协程

  1. 先来看看不用协程,实现网络加载一个列表数据异步任务
    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.

揭秘Kotlin协程中的CoroutineContext

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐