在Android中执行网络操作的最佳做​​法是什么?

时间:2013-08-05 13:36:23

标签: android android-networking

在Android中执行网络操作的最佳做​​法是什么(无需在ContentProvider中存储数据)?

目前我正在使用类似于http://www.youtube.com/watch?v=xHXn3Kg2IQE中描述的模式 - 包含在Fragment,IntentService和ResultReceiver中的服务助手。

这非常复杂和肮脏。

正在使用类似片段(带setRetainInstance(true))的东西,它启动AsyncTasks并且对Activity的回调足够好?

我想我还需要处理当活动暂停然后恢复时完成任务的情况。

有没有比这里提出的策略更好的策略?

编辑:我所指的网络操作是与简单JSON Web服务的交互

1 个答案:

答案 0 :(得分:10)

  

我所指的网络操作是与简单JSON Web服务的交互

接下来的问题是:你对这项手术有多关心?

例如,如果您正在调用StackOverflow API来检索要向用户显示的一些问题,那么如果用户在进行Web服务调用时导航远离活动,则可能不关心结果。在这种情况下,我只使用Retrofit(或在您的保留片段中启动自己的HTTP-and-JSON-in-a-background-thread代码),并将其称为好。

如果符合以下情况,IntentService就会发挥作用:

  • 您更关注正在发生的操作(例如,您正在修改服务器上的数据,而不仅仅是检索它),因此需要一项服务来帮助确保您的流程可能活得足够长要完成的工作,或

  • 您正在按计划进行Web服务调用(例如AlarmManager)或由其他事件(例如ConnectivityManager广播)驱动,例如处理{{ 3}} - 一旦设备可以访问Internet,或者

  • ,需要完成的受支持的呼叫队列
  • Web服务调用的结果可能不仅影响您的UI的一个部分,因此您希望Web服务调用由您的活动之外的组件“拥有”

为了让您的UI图层了解此类IntentService的结果,我只是ResultReceiver上的其他任何内容。我喜欢Square的Tape,但任何事件总线(例如,greenrobot的Otto)或LocalBroadcastManager都可以。

SyncManager也是另一种选择,虽然这是我的待办事项清单。

但是,我不一定会将这些描述为“最佳实践”,因为Android对我们来说有点过于流畅,无法在这个领域宣布“最佳实践”,特别是没有对此进行非常精确的描述。用例。他们“并非完全荒谬”的做法。