android - 基于接收广播 Intent 启动网络通信的正确方法是什么?

标签 android multithreading broadcastreceiver android-c2dm android-networking

我正在开始使用 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/

相关文章:

java - 给线程的最小时间

Python 线程 : Multiple While True loops

Java:在线程内设置文本

android - 从android中的 Activity 启动广播接收器

android - 如何在我的一个选项卡中响应 onConfigChanges?

android - 在表格 View 中设置列宽

java - 监听 ListView 中按钮的点击

android - ListView 布局背景颜色在滚动时闪烁在图像加载时消失?

java - 我还可以在 android 项目中使用 eclipse 吗?

android - 从 Intent 中获取多个广播?