私はMobile VisionのGoogle Barcode Scanner APIを使用するアンドロイドアプリを開発中です。アプリの目的は、バーコードを検出し、バーコードに関連付けられたデータに基づいて何らかのアクションを取ることです。CameraSource.stop()はUIスレッドから呼び出す必要がありますか?
最初のバーコードが検出されるとすぐに、検出を続行しないようにカメラソースを停止したいと考えています。 コールバック内でcameraSource.stop()
を実行しようとすると、スレッドがブロックされ、logcatに多くのログ出力があります。このコールバックはUIスレッドでは実行されないため、UIはブロックされません。 UIスレッドでcameraSource.stop()
を実行しようとしましたが、うまくいきました。
私はcameraSource.start()
をUIスレッドと別のスレッドから呼び出してみましたが、どちらもうまく動作しています。
ここでは、ドキュメンテーションのどの場所でも、カメラソースとのやりとりがUIスレッドまたはワーカースレッドである必要があります。私は別のスレッドから呼び出されたときにこれがなぜ失敗するのかという論理を理解できませんでした。
応答いただきありがとうございます。私はCameraSourceのソース(here)(https://github.com/googlesamples/android-vision)も見てきました。しかし、スレッドをブロックする代わりに、リクエストが 'receiveDetection()'を扱う同じスレッドにキューイングされていると、より意味をなさないでしょうか?最初に検出されたバーコードを処理するのを止めるためにフラグを使用することは本当にありません。また、 'stop()'が別のスレッドから呼び出された場合、stop()が実際に実行されるまで検出器は不必要に検出し続けます。 – Nishkarsh
CameraSourceから検出を実行していたスレッドが1つしかないことを強制することが目的でした。コードが今のようにスレッドに参加することなく、クライアントがCameraSourceで何度も開始および停止することが可能になりました。複数のスレッドが同時に検出を実行することがありました。スレッドは、結合試行前に非アクティブとしてマークされているため、ASAPを停止します。 – pm0733464