我有一个具体示例的一般性问题:我想在拍照时使用 Kotlin 协程魔术而不是 Android 中的回调地狱。
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()
}