在 CameraX 分析()中执行异步代码的最佳方法是什么?

时间:2021-01-15 20:55:50

标签: android kotlin asynchronous android-camerax

我正在使用 CameraX 的图像分析用例,该用例在我的自定义 analyze() 类中不断调用 Analyzer 方法。在 analyze() 中,在做任何其他事情之前,我需要向连接的设备发送请求并等待其响应;延迟非常低,我已经在同步执行,没有任何问题,但有人告诉我最好让它异步,以防设备响应太慢。

我知道 MLKit 的 process() 返回一个 Task<List<T>> 并且我已经在它上面调用了 onSuccessListener { },所以我想知道我是否可以使用类似的方法(我不能返回一个 { {1}} 从我的函数中,我如何创建一个?)。否则你会建议线程、协程或其他东西吗?

编辑: 下面是我正在尝试做的事情的简化示例。对于相机发送的给定帧,我只需要在线执行当前分析,然后返回,以便 Task<T> 将在下一帧中再次调用,它将执行下一个分析。

它可能看起来很笨拙,但它适用于在单一用途设备(我们称之为 Dev A)上持续在前台运行且没有通过触摸或其他传统方式提供用户交互的应用程序,因此它需要某种触发器来开始执行所需的操作。

触发也可能是当第一次图像分析成功时,但是整天从实时相机馈送中运行 MLKit 或 TFLite 模型会使 Dev A 过热。目前最好的解决方案似乎是等待来自独立运行的外部设备(Dev B)的触发器。

由于 Dev B 可能会响应一些延迟,我需要与它异步通信,因此首先提出问题的原因。虽然肯定有几个架构上的细微差别需要讨论,但当前问题的根源在于我无法决定(或者更确切地说,我不知道如何以非阻塞方式处理与 Dev B 的重复“连接”。

我的意思是,我是否可以像其他需要多线程的情况一样处理这个问题,或者涉及相机的事实可能会带来额外的威胁?背压策略设置为 analyze(),因此理论上如果当前对 STRATEGY_KEEP_ONLY_LATEST 的调用尚未完成,新帧将被丢弃并且即使在我仍在等待的方法内部也不会发生任何不好的事情对 Dev B 的异步调用以完成,还是我遗漏了什么?

analyze()

0 个答案:

没有答案
相关问题