Kotlin 的入门总结6(协程的概念和使用)

194 阅读2分钟

1. 协程的定义

//  协程 通过挂起和恢复控制执行流程转移(异步代码同步形式写出,更容易实现复杂业务)
//  协程 存在于程序运行时  轻量级的线程  线程抢占式,协程协作式
//  按调用 协程:有栈协程、无栈协程  对称协程、非对称协程
//  开辟了调用栈的是有栈协程可以随意的切换(协程内部通过指针、中间状态)
//  按调度权能否转移 分为对称协程、非对称协程
//  Kotlin 属于 无栈协程 非对称协程




2.协程的使用

fun showPopView(context:Activity){
    context.window?.decorView?.let {
        // 通过作用域来开启一个协程
        GlobalScope.launch{
           val result= try {
               //挂起函数 suspend修饰的函数 只能在挂起函数或协程中使用
               getUser() // 协程  挂起和恢复  挂起函数调用处就是挂起点
           }catch (e:Exception){
               null
           }?:return
            if (result.isVip){
                context.window?.decorView?.let {
                    Handler(Looper.getMainLooper()).postDelayed({ showNoVipIncome(context, it) }, 500L)
                }
            }
            //使用 withContext切换到Main早对应显示
            withContext(Dispatchers.Main) {
                context.window?.decorView?.apply {
                    showVipIncome(context, this, force)
                }
            }


        }

    }
}

//挂起函数 suspend修饰的函数 只能在挂起函数或协程中使用
//函数类型为   suspend()->Unit 线程切换才会真挂起,直接返回不会真挂起
suspend fun getUser(){
    // 网络请求,耗时操作
}
// 普通函数
fun showNoVipIncome(context:Activity,view:View){

}


Flow 的使用:

Flow 的创建三种方式:

flowOf(1,2,3,4,5)

listOf(1, 2, 3, 4, 5).asFlow()

flow{ ... }构建

channelFlow{...}


   fun foo():Flow<Int> = flow{
        for (i in 1..3){
            delay(100)//挂起函数
            emit(i)
        }
    }
    
    suspend fun main(){
        foo().collect {
            println(it)
        }
    }



flow{ ... }构建一个Flow类型
flow { ... }内可以使用suspend函数.
foo()不需要是suspend函数
emit方法用来发射数据
collect方法用来遍历结果 不会阻塞UI主线程

Flows像Sequences一样是冷流,即在调用collect之前,flow{ ... }中的代码不会执行