在Android中执行网络操作的最佳实践是什么?

4
在Android中执行网络操作的最佳实践是什么(无需将数据存储在ContentProvider中)?
目前,我正在使用类似于http://www.youtube.com/watch?v=xHXn3Kg2IQE描述的模式——一个封装在Fragment中的服务助手、一个IntentService和一个ResultReceiver。
这非常复杂和混乱。
像使用带有 setRetainInstance(true)的Fragment一样,在其中启动带有回调到Activity的AsyncTasks是否足够好?
我想我还需要处理当Activity暂停然后重新启动时任务完成的情况。
是否有比这里提出的更好的策略?
编辑:我所指的网络操作是与简单的JSON Web服务交互。

如果你需要处理活动被暂停的情况,AsyncTask 可能不是你想要的东西。我认为在这种情况下,你当前的设置将是最佳选择。 - Geobits
如果你正在寻找“最佳实践”和谷歌演示文稿的链接,那么很可能你已经得到了答案。我想你是在寻找更简单的方式? - 323go
2
请完整精确地解释您所感兴趣的“网络操作”类型。Web服务请求的策略可能与下载图像缩略图不同,可能与下载大型PDF文件不同,可能与流式传输音频不同,可能与VOIP客户端不同,可能与聊天应用程序不同,可能与Web浏览器不同... 希望您能理解我的意思。 - CommonsWare
关于你提到的“ContentProvider”相关内容:你可以使用ContentProvider的存根实现来满足ContentProvider的要求,然后使用像SyncAdapter这样的东西而不需要真正的ContentProvider - dst
@CommonsWare 我在问题中添加了更多信息 - Gal Ben-Haim
1个回答

11
我所指的网络操作是与简单JSON Web服务进行交互。
接下来的问题是:您对此操作有多在意?
例如,如果您正在调用StackOverflow API以检索一些问题并显示给用户,那么如果用户在Web服务调用进行时导航到其他活动,则您可能不关心结果。在这种情况下,我会使用Retrofit(或自己编写HTTP和JSON后台线程代码),从保留的片段启动它,然后就完成了。
如果要使用IntentService,则需要考虑以下因素:
  • 您更关心正在发生的操作(例如,在服务器上修改数据,而不仅是检索数据),因此需要一项服务来帮助确保您的进程足够长时间存活以完成工作,或者

  • 您按计划执行Web服务调用(例如,AlarmManager),或者由其他事件驱动(例如,ConnectivityManager广播),例如处理一个基于Tape的调用队列,该队列需要在设备具有互联网访问权限时完成,或者

  • Web服务调用的结果可能会影响您UI中不止一个组件,因此您希望将Web服务调用“拥有”一个位于活动之外的组件

为了让您的UI层了解这种IntentService的结果,我会使用任何其他方法来代替ResultReceiver。我喜欢Square的Otto,但是任何事件总线(例如,greenrobot的EventBus)或LocalBroadcastManager都可以。

SyncManager也是另一种选择,不过这还在我的待办事项列表中。

然而,我不会将它们描述为“最佳实践”,因为Android太过灵活,我们无法就此领域的“最佳实践”做出明确定义,特别是没有非常精确的用例说明。它们是“不完全荒谬”的做法。


为什么事件总线比ResultReceiver更适合将结果返回给UI层? - Gal Ben-Haim
@GalBen-Haim:事件总线使得多个UI组件更容易了解结果。事件总线允许将结果传递到发送者之外的其他地方。一些事件总线实现(例如Otto,EventBus)提供比“Bundle”更灵活的事件对象。等等。 - CommonsWare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接