https://www.bbsmax.com/A/kmzLNEBA5G/

https://blog.51cto.com/u_15548643/5153793(结合实例代码更易懂)

https://zhuanlan.zhihu.com/p/427092689(知乎)

https://www.jianshu.com/p/e4e7ae9473de(原理性讲解)

依赖包

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:x.x.x'
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:x.x.x"

梳理

  • 启动协程的方法
  • 挂起函数
launch方法
  • 默认launch方法

    线程A-代码1
    // 创建一个默认参数的协程,其默认的调度模式为Main 也就是说该协程的线程环境是Main线程
    mScope.launch {
            // 这里就是协程体
            // 协程将线程的执行权交出去,该线程A该干嘛干嘛,线程A代码执行完毕后会恢复至此继续向下执行
            Log.d(TAG,"aaaa")
            delay(1000)
            Log.d(TAG,"bbbb")
        }
    线程A-代码2
    ...
    线程A代码执行完毕
  • launch(Dispatchers.IO)

    
    // 创建一个指定了调度模式的协程,该协程的运行线程为IO线程
        val job2 = mScope.launch(Dispatchers.IO) {
    
            // 此处是IO线程模式
    
            // 切线程 将协程所处的线程环境切至指定的调度模式Main
            withContext(Dispatchers.Main) {
                // 现在这里就是Main线程了  可以在此进行UI操作了
            }
        }


#####  Dispatchers 有哪些值
- Dispatchers.Main:Android 主线程。用于调用 suspend 函数,UI 框架操作,及更新 LiveData 对象。
- Dispatchers.IO:非主线程。用于磁盘操作(例如,Room 操作),及网络 I/O 请求(例如,调用服务器 API)。
- Dispatchers.Default:非主线程,用于 CPU 密集型操作。例如,list 排序,及 JSON 解析。
这里需要注意的是,在 launch 不加参数时,其默认值是 Dispatchers.Main,而不是 Dispatchers.Default。
分类: 协程

0 条评论

发表回复

您的电子邮箱地址不会被公开。