2016-12-06 55 views
0

我正在使用Mobile Vision中使用Google Barcode Scanner API的Android應用程序。應用程序的目的是檢測條形碼,然後根據與條形碼相關的數據採取一些行動。是否需要從UI線程調用CameraSource.stop()?

一旦檢測到第一個條形碼,我想停止相機源,以便檢測不應該繼續。當我嘗試在receiveDetections(Detector.Detections<Barcode> detections)回調內執行cameraSource.stop()時,線程被阻塞,logcat中有很多日誌輸出。由於此回調未在UI線程中執行,因此UI保持暢通。我嘗試在UI線程中執行cameraSource.stop(),它工作正常。

我已經嘗試從UI線程調用cameraSource.start()以及另一個線程,都工作正常。

現在我無法在文檔中找到與cameraSource的交互應該來自UI線程或工作線程的任何地方。我無法弄清楚爲什麼在從另一個線程調用時會失敗的邏輯。

回答

1

不需要從UI線程調用CameraSource.stop(),但由於實現細節,不應該從執行receiveDetections的線程調用它。 stop()代碼等待這個線程完成,所以用這種方式調用會造成死鎖。

+0

感謝您的回覆,它使它更加清晰。我也看了一下'CameraSource'的源代碼[here](https://github.com/googlesamples/android-vision)。但是,如果不是阻塞線程,請求排隊到處理'receiveDetection()'的同一個線程,那麼它會更有意義嗎?一旦檢測到第一個條形碼,我真的不想使用標誌停止處理檢測到的條形碼。另外,如果從另一個線程調用stop(),檢測器將繼續不必要地檢測,直到實際執行stop()時間爲止。 – Nishkarsh

+0

意圖是強制執行從CameraSource執行檢測的唯一線程。如果不像現在的代碼那樣加入線程,客戶就有可能多次在CameraSource上啓動和停止,有時會導致多個線程同時執行檢測。線程將盡快停止,因爲它在連接嘗試之前被標記爲非活動狀態。 – pm0733464

相關問題