Android 概念:Datasource 属于 Activity 还是 Fragment

Posted

技术标签:

【中文标题】Android 概念:Datasource 属于 Activity 还是 Fragment【英文标题】:Android Concept: Does Datasource belong in Activity or Fragment 【发布时间】:2017-11-19 13:09:30 【问题描述】:

问题:假设我有一个 Web 服务返回一个 JSON,我将其反序列化为一个 POJO(列表),每个 Fragment 是否应该获取数据源的副本,或者我应该保留数据源仅在活动中并让片段通过回调接口(我在 onAttach() 中设置)获取数据?或者还有其他更好的方法吗?

为什么

我在 android 上工作了一段时间,但我认为我还没有完全理解一些非常基本的原理,希望你能帮助我澄清一些事情。在我的一个应用程序中,我使用Volley 调用返回 JSON 格式数据的 Web 服务。

我使用GSON 将 JSON 反序列化为 POJO。然后我使用 greenrobots EventBus 发送新数据,以便我可以更新 UI。目前我所有的片段都注册为订阅者,每个片段都存储对数据的引用。

我认为我做错了,因为如果片段当前没有显示怎么办(他们在 onStop() 中从 EventBus 注销)。他们可能会错过模型的更新,当弹出 Backstack 时,他们可能会显示一个过时的模型,对吧?

那么存储模型的最佳方式是什么,以便我的所有 UI 组件和控制器始终显示模型的最新版本?我担心一个或另一个组件(片段和/或活动)可能会错过更新,然后显示过时的数据。

Android 以什么方式存储从 Web 服务检索到的模型并使它们可供 Activity 和 Fragment 访问?

我认为我的主要问题是我可以在多个活动和片段中刷新数据。例如,我可以在下拉刷新条目列表后重新加载数据,但重命名条目也会导致更新 - 但仅限于这个特定条目。

【问题讨论】:

【参考方案1】:

你有没有想过使用 sqlite 来存储数据,然后显示出来? 我会做如下:

以 json 格式从服务中获取数据

解析json并将其存储在sqlite表中

在需要时从 sqlite 表中读取

这样做的好处是您可以存储新数据以及更新旧数据,正如您所说,您可以使用下拉刷新功能,这有助于存储最新数据和旧数据一并始终在您从正在更新的数据源中获取数据时显示最新数据。

【讨论】:

我正在考虑使用某种持久性,例如 SQLite 或 Realm,但另一方面,这可能有点过头了,因为我很可能只处理一堆 JSON 对象,而我每次应用程序启动或一段时间不活动时都必须重新加载它们。每 5 秒到每小时一次(远程设备的 gps 位置更新)之间的更新非常有规律。我也在考虑使用 Firebase 实时数据库,但目前服务器端后端只为我提供基于 JSON 的 REST Web 服务。 也许 Singleton 可以充当数据存储并将这些 POJO 保存在内存中,但我想知道 Android 是否真的有一些最佳实践。

以上是关于Android 概念:Datasource 属于 Activity 还是 Fragment的主要内容,如果未能解决你的问题,请参考以下文章

Android-spinner

Jdbc非学术性地理解DataSource和Jdbc

请问如何把DataGrid上的datasource转换成datatable或者dataset啊

grafana 基本概念

如何创建 DataSource

源码中的设计并没有你想象的那么复杂,不信你来看看MyBatis的DataSource的实现