Android MVP持久化

5

我正在尝试按照 Android 蓝图指南将 MVP 模式引入我的项目中。目前,我将“用户”(实体数据)存储在 Presenter 中,但是我非常不喜欢这样做,因为每次配置更改时,Presenter 都需要从数据库中获取用户。

我的第一个问题是:

  • 我应该将数据保留在 Repository 中(因为我正在使用 Dagger 2,Repository 存在于应用程序范围内),还是应该将其保存在 Presenter 中并在那里持久化。我个人比较喜欢将其保留在 Presenter 中,但是我想了解一下常规做法。

我也知道 Android 架构组件,特别是 ViewModel,但是我希望仍然使用 MVP 模式,而不是 MVVM。

我的第二个问题是:

  • 在实现持久性之后,我应该如何在 MVP 中使用 LiveData?

我已经被这个问题卡住了一段时间,很希望最终能够解决它。

谢谢!

2个回答

4
我应该将数据保存在Repository中,还是将其保存在Presenter中并在其中进行持久化处理?
您提出了一个有趣的问题,这也是我开始使用MVP时遇到的问题。以下是我的建议:
关于您提到的两个选项,一直存在争论。我个人更喜欢使用仓库模式。在我看来,它更加清晰,并且处理诸如屏幕旋转时已经在请求中的情况等变得更加容易。此外,每次设备旋转时,您无需从数据库中获取数据。如果您认为这很昂贵,可以在数据库之前创建缓存级别。有一篇非常有趣和详细的文章:Presenters are not for persisting,作者是Mike Nakhimovich,他在担任纽约时报Android开发人员期间,参与了一个名为Store的库的工作,该库有助于实现相同的功能。从文章中可以得知:
“我建议使用抽象数据加载的数据存储。我们可以利用仓库模式创建数据提供程序/存储器,从网络获取数据并在需要时进行缓存。首先,这种方法使持久化数据变得更加容易。另一个优点是我们有了一个统一的数据来源。最后,我们可以消除诸如交互器之类的东西,只需在需要查看内容时让您的Presenter订阅您的Stores即可。”
希望这能对您有所帮助。

1

仓库应该只作为从不同数据源访问数据的门户。

例如

如果您可以同时从API和磁盘(缓存数据)获取用户数据,则在仓库类中隔离选择获取哪个数据源的逻辑。Presenter 对此一无所知。Presenter 只请求用户数据。

话虽如此

Presenter 需要持有正在查询的数据的引用(即 UserModel),仓库只从任何数据源检索数据,就这样。对于任何与数据相关的操作(保存、删除、更新、检索等),都是如此。因此,如果您需要持有应用程序范围引用到您的数据对象,请创建一个单独的类,比如命名为 InMemoryStore 并将其标记为应用程序范围,并在其中保留引用。使用仓库模式从中查询数据。

还要注意的是

每个层应该持有不同形式的数据。视图层(即 RecyclerView)中使用的模型应该只持有视图所需的数据,没有多余的数据。同样适用于 Presenter 和模型层(通常模型层持有最多关于模型的信息)。

这意味着您需要为每个模型类编写一个映射器类,以便从一种形式转换为另一种形式。您可以参考this example以获得更好的理解。
最后,
由于我使用RxJava,我没有感到需要使用LiveData,因此我对此主题不太了解。
您可以查看full example,了解如何使用MVP、RxJava和Dagger。
希望这很有帮助并且清晰明了 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接