在 Android 中执行网络操作的最佳实践是什么(无需在 ContentProvider 中存储数据)?
目前我使用的模式类似于 http://www.youtube.com/watch?v=xHXn3Kg2IQE 中描述的模式- 包裹在 Fragment、IntentService 和 ResultReceiver 中的服务助手。
这非常复杂和肮脏。
正在使用类似 Fragment 的东西(使用 setRetainInstance(true)
)启动 AsyncTasks 并回调到 Activity 是否足够好?
我想我还需要处理在 Activity 暂停然后恢复时完成任务的情况。
有没有比这里提出的更好的策略?
编辑:我指的网络操作是与简单的 JSON 网络服务的交互
The network operations I'm referring to are interactions with simple JSON web services
那么接下来的问题是:你对操作有多在乎?
例如,如果您正在调用 StackOverflow API 来检索一些问题以显示给用户,如果用户在 Web 服务调用正在进行时离开 Activity ,您可能不关心结果。在那种情况下,我只使用 Retrofit (或在后台线程中滚动您自己的 HTTP 和 JSON 代码),将其从您保留的 fragment 中删除,并称之为好。
IntentService
将在以下情况下发挥作用:
您更关心正在发生的操作(例如,您正在修改服务器上的数据,而不仅仅是检索数据),因此需要一种服务来帮助确保您的流程可能存在足够长的时间要完成的工作,或者
您正在按计划(例如,AlarmManager
)或由其他事件(例如,ConnectivityManager
广播)驱动进行 Web 服务调用,例如处理Tape - 一旦设备可以访问互联网就需要完成的支持调用队列,或者
Web 服务调用的结果可能影响的不仅仅是您的 UI 的一部分,因此您希望 Web 服务调用由您的 Activity 之外的组件“拥有”
为了让您的 UI 层知道来自这样一个 IntentService
的结果,我只想通过 ResultReceiver
做任何其他事情。我喜欢 Square 的 Otto ,但任何事件总线(例如,greenrobot 的 EventBus )或 LocalBroadcastManager
都可以工作。
SyncManager
也是另一种选择,尽管它在我的待办事项列表中。
但是,我不一定会将其中任何一个描述为“最佳实践”,因为 Android 的流动性太强,我们无法在该领域宣布“最佳实践”,尤其是在没有非常精确的描述的情况下用例。它们是“并非完全荒谬”的做法。