2013-10-02 8 views
2

Как говорится в названии, есть способ запустить метод BroadcastReceiver onReceive() асинхронно?BroadcastReceiver asynchronous onReceive

Основываясь на его реализации, андроид запускает метод onReceive() на основной теме.

Я использую BroadcastReceiver для явного запроса разрешения на связь с USB-устройством. Когда разрешение разрешения запроса получено, вызывается метод onReceive(), но поскольку он работает в основном потоке, нет способа (по крайней мере, не того, что я знаю) сигнализировать, когда он будет завершен. Опрос на булевом флаге блокирует основной поток, который, в свою очередь, блокирует вызов метода onReceive().

Есть ли способ для асинхронного вызова onReceive() или есть альтернативный способ явно (без использования фильтров намерения в манифесте) запрашивать разрешение и подключиться к USB-устройству?

Редактировать: Мне бы хотелось, чтобы метод блокировался до тех пор, пока не будет получено разрешение и не будет установлено соединение.

ответ

1

Вы можете отправить трансляцию в onReceive вашего вещательного приемника. Цель трансляции может быть зарегистрирована в методах жизненного цикла Activity и может быть незарегистрирована в том же.

+0

Да, это решение, но (см. Править) Я хотел бы заблокировать, пока у меня не будет разрешения. –

+0

«Когда диалоговое окно разрешения запроса получено, метод onReceive() называется«. Разве ваш получатель не получает трансляцию, когда разрешение было предоставлено? –

+0

Да, это правильно, когда получено разрешение, 'UsbManager' транслирует' PendingIndent', а получатель вызывает 'onReceive()' и проверяет дополнительные намерения. Но это работает на основном потоке. –

0

Прежде всего, вы не должны делать ничего, что блокирует основной поток. Во-вторых, если вы не используете registerReceiver(BroadcastReceiver, IntentFilter, String, Handler), вы никогда не должны делать ничего, что занимает много времени в BroadcastReceiver.onReceive, так как он, скорее всего, будет убит через 10 секунд (см. documentation for BroadcastReceiver). Вы должны запустить AsyncTask или отдельный поток из метода onReceive. Если вы хотите прекратить взаимодействие с остальной частью пользовательского интерфейса до тех пор, пока USB-устройство не будет подключено, сделайте это, не блокируя основной поток. Явно отключить вещи или переключиться на какой-то простой фрагмент или действие с загрузочным GIF или чем-либо кроме блокировки. Блокировка основного потока приведет к появлению диалогового окна системы wait-or-kill, и пользователь никогда не будет ждать ожидания.

Простой ответ на ваш вопрос заключается в том, чтобы зарегистрировать приемник программно, используя registerReceiver вместо использования манифеста, но сначала я должен был дать некоторые отказы.

0

У вас может быть частичное асинхронное поведение по вашему желанию.

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

Пример использования может быть показан here.

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