Каков правильный способ инициировать сетевое взаимодействие на основе получения широковещательного намерения?

Я начинаю работу с Google C2DM. Часть этого процесса включает в себя получение широковещательного намерения после регистрации. В официальной документации Google по C2DM пример кода показывает следующий комментарий в методе onReceive() BrodcastReceiver. :

// Send the registration ID to the 3rd party site that is sending the messages.
// This should be done in a separate thread.

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

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

Есть ли причина, по которой нельзя или не следует использовать сеть из того же потока, что и onReceive() перед возвратом? Если это проблематично, как правильно поступить, что должно быть распространенной ситуацией, даже вне C2DM? Запуск службы?


person Darshan Rivka Whittle    schedule 30.05.2012    source источник


Ответы (1)


Хорошо, проведя еще несколько исследований, я нашел этот вопрос и выбранный ответ утверждает, что onReceive() выполняется в потоке пользовательского интерфейса. Мне это не приходило в голову — поскольку это приемник, объявленный в манифесте, насколько мне известно, не было потока пользовательского интерфейса.

Поскольку вы не можете работать в сети в потоке пользовательского интерфейса на Android, это отвечает на первую часть моего вопроса:

  • Вы оба не должны и не можете инициировать сетевое взаимодействие с onReceive().

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

person Darshan Rivka Whittle    schedule 06.06.2012
comment
AsyncTask здесь не подходит. По сути, любая асинхронная операция не подходит для onReceive(). Подробности смотрите в onReceive() документации. Лучше всего запустить Service, который инициирует сетевое соединение. - person curioustechizen; 06.06.2012
comment
О да, я думал об этом раньше, но я был взволнован, узнав, что мы находимся в потоке пользовательского интерфейса, и забыл об этом. Спасибо. - person Darshan Rivka Whittle; 06.06.2012