6

Я начинаю с C2DM от Google. Часть этого процесса предполагает получение трансляции, когда происходит регистрация. В Google's official C2DM documentation, пример кода показывает следующий комментарий в OnReceive в BrodcastReceiver в() метод:Каков правильный способ инициировать сетевую связь на основе приема трансляции?

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

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

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

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

ответ

3

Хорошо, после проведения еще нескольких исследований я нашел this question и the selected answer утверждает, что onReceive() работает по потоку пользовательского интерфейса. Это мне не приходило в голову - так как это заявленный манифест приемник, насколько я знаю, был нет нити пользовательского интерфейса.

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

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

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

+0

'AsyncTask' здесь не подходит. В принципе, асинхронная операция _any_ не подходит для 'onReceive()'. Взгляните на документацию 'onReceive()' для получения подробной информации. Лучше всего начать «Сервис», который инициирует сетевое общение. – curioustechizen

+0

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

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