【发布时间】:2022-01-11 09:51:46
【问题描述】:
我目前正在使用相机库和 mlkit 开发人脸检测。
相机库提供了一个FrameProcessor,我在其中以流的方式获取Frame。我在挂起函数中写了FrameProcessingTask。
在cameralib内部FrameProcessor在ThreadPoolExecutor内部被调用
mFrameProcessingExecutor.execute(new Runnable() {
@Override
public void run() {
for (FrameProcessor processor : mFrameProcessors) {
try {
processor.process(frame);
} catch (Exception e) {
LOG.w("Frame processor crashed:", e);
}
}
frame.release();
}
});
在我这边我写过:
private val processor = FrameProcessor { frame ->
runBlocking { // used runBlocking to bridge suspend coroutine
frameProcessingTask(frame)
}
}
suspend fun frameProcessingTask(frame: Frame) = withContext(Dispatchers.Default)
//face detection & processing code written here.
}
我的问题:
- 在
Executor中使用runBlocking是否正确,因为它在每一帧中都被连续调用。 - 如果
Executor取消任务,会发生什么暂停runBlocking部分 - 如果
processor.process(frame);在frameProcessingTask完成任务之前再次调用会发生什么。
【问题讨论】:
-
这里为什么需要使用协程?
processor.process(frame)已在其自己的Executor中调用。 -
ml 套件检测使用了回调,我需要将其转换为挂起函数并使用它。 @Sergey
标签: android android-camera kotlin-coroutines