1 Kotlin中的suspendCoroutine详解 suspendCoroutine是Kotlin协程提供的一个底层API,它用于将回调风格的异步代码转换为挂起函数。
private fun main() {
lifecycleScope.launch {
withContext(Dispatchers.Main) { //回调可能在其他线程触发
val result = fetchDataSuspend()
//这里有异常会导致崩溃,下次再来学协程捕捉协程异常
Log.d("tanyl", "result =$result")
}
}
}
//目前项目中存在的一个回调风格的API例子
private fun fetchData(callback: (String, Throwable?) -> Unit) {
Thread {
Thread.sleep(2000) //模拟耗时操作,协程不会阻塞主线程,而是挂起等待
callback("返回服务端请求的数据", null)
callback("有异常的数据", Exception("服务端错误"))
}.start()
}
/**
* 适用于简单的挂起转换
* suspendCoroutine 让fetchDataSuspend挂起,等待异步任务完成后恢复执行
* continuation.resume(result)作用是恢复协程,并返回结果result
*/
private suspend fun fetchDataSuspend(): String = suspendCoroutine { continuation ->
fetchData { result, error ->
if (error != null) {
continuation.resumeWithException(error)
} else {
continuation.resume(result) //耗时操作完成,恢复协程
}
}
}
/**
* 适用于可取消任务
*/
private suspend fun fetchDataSuspendCancelable(): String =
//正确处理取消
suspendCancellableCoroutine { continuation ->
fetchData { result, error ->
if (error != null) {
continuation.resumeWithException(error)
} else {
continuation.resume(result) //耗时操作完成,恢复协程
}
}
continuation.invokeOnCancellation {
}
}