gpt4 book ai didi

android - Kotlin Coroutines 的现有 3 函数回调

转载 作者:IT老高 更新时间:2023-10-28 13:32:41 26 4
gpt4 key购买 nike

我有一个具体示例的一般性问题:我想在拍照时使用 Kotlin 协程魔法而不是 Android 中的回调 hell 。

manager.openCamera(cameraId, object : CameraDevice.StateCallback() {
override fun onOpened(openedCameraDevice: CameraDevice) {
println("Camera onOpened")
// even more callbacks with openedCameraDevice.createCaptureRequest()....
}

override fun onDisconnected(cameraDevice: CameraDevice) {
println("Camera onDisconnected")
cameraDevice.close()
}
...

我如何将其转换为不那么丑陋的东西? 是否可以通过将主要流程指定为 promise-result 路径来将平均回调与三个左右的函数转换为 promise-chain? 如果那么,我应该/应该使用协程使其异步吗?

我喜欢 async 和 .await 的结果

manager.open(cameraId).await().createCaptureRequest()

我正在尝试通过以下方式进行操作,但我认为我没有使用 CompletableDeferred 对!

suspend fun CameraManager.open(cameraId:String): CameraDevice {
val response = CompletableDeferred<CameraDevice>()
this.openCamera(cameraId, object : CameraDevice.StateCallback() {
override fun onOpened(cameraDevice: CameraDevice) {
println("camera onOpened $cameraDevice")
response.complete(cameraDevice)
}

override fun onDisconnected(cameraDevice: CameraDevice) {
response.completeExceptionally(Exception("Camera onDisconnected $cameraDevice"))
cameraDevice.close()
}

override fun onError(cameraDevice: CameraDevice, error: Int) {
response.completeExceptionally(Exception("Camera onError $cameraDevice $error"))
cameraDevice.close()
}
}, Handler())
return response.await()
}

最佳答案

在这种特殊情况下,您可以使用通用方法通过 suspendCoroutine 函数将基于回调的 API 转换为挂起函数:

suspend fun CameraManager.openCamera(cameraId: String): CameraDevice? =
suspendCoroutine { cont ->
val callback = object : CameraDevice.StateCallback() {
override fun onOpened(camera: CameraDevice) {
cont.resume(camera)
}

override fun onDisconnected(camera: CameraDevice) {
cont.resume(null)
}

override fun onError(camera: CameraDevice, error: Int) {
// assuming that we don't care about the error in this example
cont.resume(null)
}
}
openCamera(cameraId, callback, null)
}

现在,在您的应用程序代码中,您只需执行 manager.openCamera(cameraId) 并获取对 CameraDevice 的引用(如果它已成功打开或 null 如果不是。

关于android - Kotlin Coroutines 的现有 3 函数回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48552925/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com