我正在开始使用 Google 的 C2DM。此过程的一部分涉及在注册发生时接收 Broadcast Intent。在 Google's official C2DM documentation ,示例代码在 BrodcastReceiver 的 onReceive() 方法中显示了以下注释:
// 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 之外,处理常见情况的正确方法是什么?启动服务?
最佳答案
好的,经过更多研究,我找到了 this question , 和 the selected answer说明 onReceive()
在 UI 线程上运行。我没有想到这一点——因为这是一个 Manifest 声明的接收器,据我所知, 没有 UI 线程。
由于您不能在 Android 的 UI 线程上进行联网,这回答了我问题的第一部分:
- 你们不应该也不能从
onReceive()
启动网络通信。
我们在 UI 线程上的事实使它看起来几乎像一个 ASyncTask是合适的,但这与手动启动另一个线程有相同的问题。所以看来 Service
是唯一的选择。
关于android - 基于接收广播 Intent 启动网络通信的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10825087/