Android:使用Singleton从网络加载数据

时间:2017-10-03 22:07:39

标签: android singleton rx-android

因此,这是Android中非常标准的任务:从服务器加载数据并将其显示在屏幕上。当然,最大的问题之一是处理配置更改。例如,当启动加载并旋转设备时,不得再次启动加载,并且仍必须显示加载进度。

现在,人们处理这个基本问题的方式有很多种。我们说,我们使用Model-View-Presenter模式。许多解决方案都围绕保存Presenter,全部或部分(在View的捆绑中,以Singleton或任何其他方式)保存Presenter,以免丢失旋转数据。其他涉及保留碎片和AsyncTasks。我很少遇到使用Singleton执行加载数据的解决方案!那是为什么?

这就是我认为可以轻松完成的方式。我们制作演示者" light"并且不执行任何状态保存,并在作为Singleton的存储库中处理数据加载。当设备旋转时,新创建的Presenter可以从存储库获取当前加载状态,相应地更新其View,如果加载数据,则重新订阅存储库(通过回调或RxJava Observable)以在加载数据时得到通知。对于Repository,它可以在RxAndroid的帮助下轻松地在后台加载数据。那么,是否更容易在一个地方处理所有数据加载业务而不担心活动的生命周期?

这样我们基本上可以跳过整个配置更改问题。我看到的只有几件事必须小心处理:

  • Singleton中的活动泄漏。为了防止这种情况,我们只需在其View被销毁时从存储库中取消订阅Presenter。
  • 测试,因为测试Singleton更难。但如果我们使用Dagger,这不是问题 - 在这种情况下,我们可以像任何其他类一样测试Repository。

所以我的问题是:为什么这种方法(在Singleton中执行数据加载)不是常见的解决方案?我错过了什么?

1 个答案:

答案 0 :(得分:1)

我认真地建议您阅读专门针对网络请求的库,而不是尝试重新发明轮子并且必须处理可能出现的所有陷阱。

最近我一直在尝试RoboSpice。如果你在下面的页面上阅读,你会发现它"异步执行网络请求(在后台AndroidService中)",正是为了避免内存泄漏。

我说,试一试!我工作场所的很多项目都使用了RoboSpice,而且它们都运行良好。

https://github.com/stephanenicolas/robospice