Android 是否需要从UI线程调用CameraSource.stop()?
我正在开发一款android应用程序,它使用了MobileVision的谷歌条形码扫描API。应用程序的目的是检测条形码,然后根据与条形码相关的数据采取一些措施 一旦检测到第一个条形码,我想停止相机源,这样检测就不会继续。当我尝试执行Android 是否需要从UI线程调用CameraSource.stop()?,android,multithreading,camera,barcode,google-vision,Android,Multithreading,Camera,Barcode,Google Vision,我正在开发一款android应用程序,它使用了MobileVision的谷歌条形码扫描API。应用程序的目的是检测条形码,然后根据与条形码相关的数据采取一些措施 一旦检测到第一个条形码,我想停止相机源,这样检测就不会继续。当我尝试执行cameraSource.stop()内部receiveDetections(Detector.Detections)回调时,线程被阻塞,logcat中有大量日志输出。由于此回调未在UI线程中执行,UI将保持解锁状态。我尝试在UI线程中执行cameraSource.
cameraSource.stop()
内部receiveDetections(Detector.Detections)
回调时,线程被阻塞,logcat中有大量日志输出。由于此回调未在UI线程中执行,UI将保持解锁状态。我尝试在UI线程中执行cameraSource.stop()
,效果很好
我尝试过从UI线程和另一个线程调用cameraSource.start()
,这两个线程都可以正常工作
现在我在文档中的任何地方都找不到与cameraSource的交互应该来自UI线程或工作线程。我无法理解从另一个线程调用时失败的逻辑。没有必要从UI线程调用CameraSource.stop(),但由于实现细节,不应从执行receiveDetections的线程调用它。stop()代码等待该线程完成,因此以这种方式调用它将创建死锁。感谢您的响应,它使它更加清晰。我还查看了
CameraSource
的源代码。但是,如果不是阻塞线程,而是将请求排队到处理receiveDetection()
的同一个线程,这不是更有意义吗?我真的不想在检测到第一个条形码后使用标志停止处理检测到的条形码。另外,如果从另一个线程调用stop()
,检测器将继续进行不必要的检测,直到实际执行stop()。其目的是强制执行只有一个线程从CameraSource执行检测。如果没有像代码现在那样加入线程,客户端可能会多次在CameraSource上启动和停止,有时会导致多个线程同时执行检测。线程将尽快停止,因为它在尝试加入之前被标记为非活动。