android - 将 REST 调用与 `Activity` 解耦的最佳方法

标签 android retrofit

我正在使用 Retrofit,并希望当用户在我的 Activity 之间导航时 REST 调用能够继续存在(而不是仅在配置更改时保留它们)。几个选项:

  1. 改进 AsyncTask 中的同步调用,并将其放入保留的 "task fragment"
  2. 改进IntentService and broadcast内的同步调用
  3. 谷歌 suggests每个应用程序的单例,至少对于 Volley...

最好的方法是什么?我可以将 RxJava 视为一种改造模式,但即使有,也只是建议“最迟在 onDestroy 中取消订阅返回的 Observable” - 所以这不是一个真正的解决方案,尽管人们对新的内置 Rx 支持大肆宣传。

最佳答案

我认为保留的 fragment 不会达到您想要的效果。它可以帮助处理配置更改,但不能帮助处理 Activity 之间的更改。

您可能应该将问题分成两个问题,一个是从哪里开始网络调用,另一个是接收响应。

对于第一个问题,在Activity/Fragment中可以正常启动网络调用。如果您要经常这样做,您可能需要管理服务中的调用并使用某种队列。

要接收响应,您应该确保您的监听器(回调或订阅者)未绑定(bind)到您的 Activity/Fragment 实例(对嵌套类或顶级类使用静态)。然后,您可以使用广播或 EventBus/Otto 将结果转发到 Activity。

这可以在回调/订阅者中处理,也可以在服务上下文中处理。 (虽然如果你想在 Activity 中使用 Broadcast,你应该引用 Context.getApplicationContext() 而不是当前的 Activity 上下文,以防你的 Activity 被销毁)

执行此操作后,即使请求网络调用的 Activity 已停止,您的网络调用也应该正常恢复而不会出现错误。

最后一步是缓存响应,因为如果 Activity 停止,则响应将无处可去。虽然网络调用完成了,但是却被浪费了。您应该以某种方式缓存这些响应,以便您的 Activity/Fragment 可以在重新创建时检索它们。

我个人会选择 Service 与 EventBus 组合。

关于android - 将 REST 调用与 `Activity` 解耦的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26239650/

相关文章:

android - GoogleTV Mediaplayer 无法使用传输编码 : chunked 处理 http 数据源

android - 如何在 listview 中显示来自 android 中的 json 响应的图像

java - Android Studio 模拟器未运行。代码没问题

android - GridLayout columnCount 在非全息主题中不起作用

android - VOIP 应用程序(如 Marshmallow 上的 Whatsapp/Viber/Line/Skype)在锁定屏幕上的来电

java - 为什么我在 Android Media Player 中遇到这 3 个疯狂的错误

java - 向改造请求添加 header

android - 使用 OkHttp 或 Retrofit 将文件上传到 AWS S3 存储桶

android - 改造 response.errorBody() 为空

android - : Lorg/apache/http/client/methods/HttpPost 解析失败