2016-12-06 3 views
0

Я работаю над Android-приложением, которое использует API сканера штрих-кода Google от Mobile Vision. Целью приложения является обнаружение штрих-кода, а затем выполнение некоторых действий на основе данных, связанных со штрих-кодом.Требуется ли вызвать CameraSource.stop() из потока пользовательского интерфейса?

Как только первый штрих-код обнаружен, я хочу остановить источник камеры, чтобы обнаружение не продолжалось. Когда я пытаюсь выполнить cameraSource.stop() внутри обратного вызова receiveDetections(Detector.Detections<Barcode> detections), поток блокируется и в logcat много выходных данных журнала. Поскольку этот обратный вызов не выполняется в потоке пользовательского интерфейса, пользовательский интерфейс остается разблокированным. Я попытался выполнить cameraSource.stop() в потоке пользовательского интерфейса, и он отлично работал.

Я попытался позвонить cameraSource.start() из нити пользовательского интерфейса, а также другой поток, и оба работают нормально.

Теперь я не мог найти его нигде в документации, что взаимодействие с CameraSource должно происходить из потока пользовательского интерфейса или рабочего потока. Я не мог понять логику того, почему это может произойти при вызове из другого потока.

ответ

1

Нет необходимости вызывать CameraSource.stop() из потока пользовательского интерфейса, но из-за детали реализации он не должен вызываться из потока, который выполняет getDetections. Код stop() ожидает завершения этого потока, поэтому его вызов таким образом создаст тупик.

+0

Спасибо за ответ, это делает его более понятным. Я также посмотрел источник «CameraSource» [здесь] (https://github.com/googlesamples/android-vision). Но не имеет смысла, если вместо блокировки потока запрос ставится в очередь к тому же потоку, который обрабатывает 'receiveDetection()'? Я действительно не хочу использовать флаги, чтобы остановить обработку обнаруженных штрих-кодов после обнаружения первого. Кроме того, если 'stop()' вызывается из другого потока, детектор будет продолжать обнаруживать ненужно до тех пор, пока фактически не будет выполнен stop(). – Nishkarsh

+0

Цель заключалась в том, чтобы обеспечить, чтобы был только один поток, выполняющий обнаружение из CameraSource. Без присоединения к потоку, как это делает код сейчас, клиенты могли бы запускать и останавливать на CameraSource много раз, иногда приводя к тому, что несколько потоков выполняли обнаружение одновременно. Поток остановится как можно скорее, поскольку он будет отмечен как неактивный до попытки соединения. – pm0733464

Смежные вопросы