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<UserInfo> {
// 发起网络请求
HttpRequest().url("/test/getUserInfo").callback(object : HttpCallback<UserInfo?>() {
override fun onError(request: Request?, throwable: Throwable) {
it.resumeWithException(throwable)
}
override fun onResponse(userInfo: UserInfo?) {
it.resume(userInfo)
}
})
}
}
网友评论