Kotlin 协程 WithContext

withContext 介绍

  • 是一个 suspend 函数,所以必须在协程或者 suspend 函数中使用。
  • 需要显示的指定作用域。
  • 会阻塞当前线程。
  • 有返回值,为代码块最后一行的值。
  • 返回后,会再切回当前线程。


示例

利用 withContext 实现一个线程切换的逻辑。

fun main() {
    // 开启一个主线程作用域的协程
    CoroutineScope(Dispatchers.Main).launch {
        // getUserInfo 是一个 suspend 函数,且在 IO 线程中
        val userInfo = getUserInfo()
        // 网络请求以同步的方式返回了,又回到了主线程,这里操作了 UI
        tvName.text = userInfo.name
    }
}

// withContext 运行在 IO 线程
suspend fun getUserInfo() = withContext(Dispatchers.IO){
    // 这里的网络请求结果在 callback 中
    // 所以借助 suspendCoroutine 函数同步使用 callback 返回值
    // 返回值为 UserInfo 对象
    // 还有 suspendCancellableCoroutine 函数也可以了解下
    suspendCoroutine {
        // 发起网络请求
        HttpRequest().url("/test/getUserInfo").callback(object : HttpCallback() {
            override fun onError(request: Request?, throwable: Throwable) {
                it.resumeWithException(throwable)
            }

            override fun onResponse(userInfo: UserInfo?) {
                it.resume(userInfo)
            }
        })
    }
}

你可能感兴趣的:(Kotlin 协程 WithContext)