我正在使用 Retrofit,并希望当用户在我的 Activity 之间导航时 REST 调用能够继续存在(而不是仅在配置更改时保留它们)。几个选项:
- 改进
AsyncTask
中的同步调用,并将其放入保留的 "task fragment" 中 - 改进
IntentService
and broadcast内的同步调用 - 谷歌 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/