Я работаю над Android-приложением, которое использует API сканера штрих-кода Google от Mobile Vision. Целью приложения является обнаружение штрих-кода, а затем выполнение некоторых действий на основе данных, связанных со штрих-кодом.Требуется ли вызвать CameraSource.stop() из потока пользовательского интерфейса?
Как только первый штрих-код обнаружен, я хочу остановить источник камеры, чтобы обнаружение не продолжалось. Когда я пытаюсь выполнить cameraSource.stop()
внутри обратного вызова receiveDetections(Detector.Detections<Barcode> detections)
, поток блокируется и в logcat много выходных данных журнала. Поскольку этот обратный вызов не выполняется в потоке пользовательского интерфейса, пользовательский интерфейс остается разблокированным. Я попытался выполнить cameraSource.stop()
в потоке пользовательского интерфейса, и он отлично работал.
Я попытался позвонить cameraSource.start()
из нити пользовательского интерфейса, а также другой поток, и оба работают нормально.
Теперь я не мог найти его нигде в документации, что взаимодействие с CameraSource должно происходить из потока пользовательского интерфейса или рабочего потока. Я не мог понять логику того, почему это может произойти при вызове из другого потока.
Спасибо за ответ, это делает его более понятным. Я также посмотрел источник «CameraSource» [здесь] (https://github.com/googlesamples/android-vision). Но не имеет смысла, если вместо блокировки потока запрос ставится в очередь к тому же потоку, который обрабатывает 'receiveDetection()'? Я действительно не хочу использовать флаги, чтобы остановить обработку обнаруженных штрих-кодов после обнаружения первого. Кроме того, если 'stop()' вызывается из другого потока, детектор будет продолжать обнаруживать ненужно до тех пор, пока фактически не будет выполнен stop(). – Nishkarsh
Цель заключалась в том, чтобы обеспечить, чтобы был только один поток, выполняющий обнаружение из CameraSource. Без присоединения к потоку, как это делает код сейчас, клиенты могли бы запускать и останавливать на CameraSource много раз, иногда приводя к тому, что несколько потоков выполняли обнаружение одновременно. Поток остановится как можно скорее, поскольку он будет отмечен как неактивный до попытки соединения. – pm0733464