Android-камера: нитки? Что должно делать то, что

Я пытаюсь выяснить, какие потоки должны делать то, что в Android.

Единственное, что я нашел в официальной документации, это то, что camera.open() следует помещать в свой поток.

Как насчет:

  • camera.startPreview()
  • camera.stopPreview()
  • camera.release()

Он не указывает, какой поток им нужен . Должны ли они запускаться на основной нити (ui thread)? Или я свободен в выборе?

Почему я пытаюсь понять это? camera.startPreview() при запуске в основном потоке вызывает мое приложение для дрожания / задержки в течение короткого периода времени, это сильно влияет на мое приложение, поскольку оно помещается внутри viewPager, и я не хочу, чтобы камера всегда просматривала (Что не приведет к задержке, но потребует системных ресурсов).

Есть идеи?

В документации для камеры указано, что класс не является потокобезопасным и не должен вызываться из нескольких потоков одновременно (я полагаю, если вы не выполняете собственную синхронизацию).

В нем говорится, что обратные вызовы будут доставлены в поток, который заставляет вызов open

Из справки (акцент мой):

Этот класс не является потокобезопасным и предназначен для использования из одного потока событий . Большинство длительных операций (предварительный просмотр, фокус, захват фотографий и т. Д.) Происходят асинхронно и при необходимости вызывают обратные вызовы. Обратные вызовы будут вызываться в событии, из которого был вызван поток open (int). Методы этого класса никогда не должны вызываться из нескольких потоков одновременно.

Из справочника метода open(int) :

Обратные вызовы из других методов доставляются в цикл событий потока, который называется open (). Если этот поток не имеет цикла событий, то обратные вызовы доставляются в основной цикл событий приложения. Если нет основного цикла событий приложения, обратные вызовы не передаются.

Внимание: на некоторых устройствах этот метод может занять много времени. Лучше всего вызвать этот метод из рабочего потока (возможно, используя AsyncTask), чтобы избежать блокировки основного потока пользовательского интерфейса приложения.

Поток, в котором он нуждается, – это тот, который вы используете для вызова open(int) .

Поэтому, чтобы ответить на ваш вопрос, да, вы относительно свободны в выборе, но вы должны оставаться последовательными.

Intereting Posts