2016-12-06 13 views
0

私はMobile VisionのGoogle Barcode Scanner APIを使用するアンドロイドアプリを開発中です。アプリの目的は、バーコードを検出し、バーコードに関連付けられたデータに基づいて何らかのアクションを取ることです。CameraSource.stop()はUIスレッドから呼び出す必要がありますか?

最初のバーコードが検出されるとすぐに、検出を続行しないようにカメラソースを停止したいと考えています。 コールバック内でcameraSource.stop()を実行しようとすると、スレッドがブロックされ、logcatに多くのログ出力があります。このコールバックはUIスレッドでは実行されないため、UIはブロックされません。 UIスレッドでcameraSource.stop()を実行しようとしましたが、うまくいきました。

私はcameraSource.start()をUIスレッドと別のスレッドから呼び出してみましたが、どちらもうまく動作しています。

ここでは、ドキュメンテーションのどの場所でも、カメラソースとのやりとりがUIスレッドまたはワーカースレッドである必要があります。私は別のスレッドから呼び出されたときにこれがなぜ失敗するのかという論理を理解できませんでした。

答えて

1

CameraSource.stop()をUIスレッドから呼び出す必要はありませんが、実装の詳細により、receiveDetectionsを実行するスレッドから呼び出されるべきではありません。 stop()コードはこのスレッドが終了するのを待つので、このように呼び出すとデッドロックが発生します。

+0

応答いただきありがとうございます。私はCameraSourceのソース(here)(https://github.com/googlesamples/android-vision)も見てきました。しかし、スレッドをブロックする代わりに、リクエストが 'receiveDetection()'を扱う同じスレッドにキューイングされていると、より意味をなさないでしょうか?最初に検出されたバーコードを処理するのを止めるためにフラグを使用することは本当にありません。また、 'stop()'が別のスレッドから呼び出された場合、stop()が実際に実行されるまで検出器は不必要に検出し続けます。 – Nishkarsh

+0

CameraSourceから検出を実行していたスレッドが1つしかないことを強制することが目的でした。コードが今のようにスレッドに参加することなく、クライアントがCameraSourceで何度も開始および停止することが可能になりました。複数のスレッドが同時に検出を実行することがありました。スレッドは、結合試行前に非アクティブとしてマークされているため、ASAPを停止します。 – pm0733464

関連する問題