【发布时间】:2018-07-11 04:45:25
【问题描述】:
我有一个关于具体示例的一般性问题:我想在拍照时使用 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()
}
【问题讨论】:
-
如果有多个回调按顺序,则链式回调起作用,每个回调都提供一个结果或错误。
这里有两个并行的回调,你如何想象一次链接两个回调?您的样本选择哪一个?哦,主要流程。但是onDisconnected还是需要关闭,怎么上链呢?
标签: android kotlin kotlin-coroutines