Android 协程知识点

35 阅读1分钟

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 {

        }

    }