6

我开始使用 Google 的 C2DM。此过程的一部分涉及在注册发生时接收广播意图。在Google 的官方 C2DM 文档中,示例代码在 BrodcastReceiver 的 onReceive() 方法中显示了以下注释:

// 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 之外也是如此?启动服务?

4

1 回答 1

3

好的,在做了更多研究之后,我发现了这个问题,并且选择的答案状态onReceive()在 UI 线程上运行。我没有想到——因为这是一个清单声明的接收器,据我所知,没有UI 线程。

由于您无法在 Android 上的 UI 线程上进行联网,因此回答了我问题的第一部分:

  • 你们都不应该也不能从onReceive().

我们在 UI 线程上的事实使它看起来几乎像ASyncTask是合适的,但这与手动启动另一个线程具有相同的问题。所以看起来 aService是唯一的选择。

于 2012-06-06T09:10:50.703 回答