使用withcontext与suspendcoroutine运行协同路由功能

ego6inou  于 2021-09-13  发布在  Java
关注(0)|答案(1)|浏览(350)

我希望您能在调用这3个函数时详细说明区别:

lifecycleScope.launch(Dispatchers.IO) {
        var res = addTwoNumbers1(2,3)
    }

    lifecycleScope.launch {
        withContext(Dispatchers.IO) {
            var res = addTwoNumbers1(2, 3)
        }
    }

    lifecycleScope.launch {
        var res = addTwoNumbers2(2,3)
    }

功能:

suspend fun addTwoNumbers1(num1: Int, num2: Int): Int = suspendCoroutine { cont ->
    val res = num1+num2
    cont.resume(res)
}

suspend fun addTwoNumbers2(num1: Int, num2: Int) = withContext(Dispatchers.IO) {
    val res = num1+num2
    return@withContext res

}
yzckvree

yzckvree1#

第一个版本使用 Dispatcher.IO ,这意味着内部的任何代码都将在后台线程上执行,除非您更改它

lifecycleScope.launch(Dispatchers.IO) {
    var res = addTwoNumbers1(2,3)      // This call executes on background thread (IO pool)
}

第二个版本使用 Dispatchers.Main.immediate (ui线程,这对于 lifecycleScope )

lifecycleScope.launch {                // Starts on UI thread
    withContext(Dispatchers.IO) {      // Here thread is changed to background (IO pool)
        var res = addTwoNumbers1(2, 3)
    }
}

第三个开始一个新的合作项目 UI 线程,然后调用一个挂起函数(实际上并不挂起),该函数将更改 Dispatcher 对io

lifecycleScope.launch {              // Starts on UI thread
    var res = addTwoNumbers2(2,3)    // This function changes the dispatcher to IO
}

至于你的暂停功能, addTwoNumbers1 是唯一能够挂起的,因为它调用suspendcoroutine。 addTwoNumbers2 不是真正的挂起函数

相关问题