Android MVP 坚持
Android MVP persistence
我正在尝试按照 android 蓝图指南将 MVP 模式实施到我的项目中。目前,我将用户(实体数据)保存在我的 Presenter 中,我真的不喜欢这样做,因为在每次配置更改时,presenter 都会从数据库中获取用户。
我的第一个问题是:
- 我应该将我的数据保存在存储库中(因为我正在使用 dagger 2 并且存储库位于应用程序范围内)还是应该将其保存在演示者中并以某种方式将其保存在那里。我个人希望将它保留在演示器中,但是,我正在尝试学习 w/e 常规方法是。
我也知道 android 架构组件,尤其是 ViewModel,但是,我想保留 MVP 模式而不是 MVVM。
我的第二个问题是:
- 实现持久化后,如何将LiveData与MVP结合使用?
我已经被这个问题困扰了很长一段时间,很想最终解决它。
干杯
Repository 只应充当访问不同数据源数据的大门。
例如
如果您既可以从 API 也可以从磁盘(缓存数据)获取用户数据,则可以在存储库中隔离选择从哪个数据源获取的决策逻辑 class.主持人应该对此一无所知。主持人只要求用户数据
话虽这么说
presenter 需要保存对其查询的数据(即 UserModel)的引用,repo 仅从任何数据源检索数据,仅此而已。这同样适用于任何与数据相关的操作(保存、删除、更新、检索等)。因此,如果您需要保留对数据对象的应用程序范围引用,请创建一个单独的 class 假设命名为 InMemoryStore
并将其标记为应用程序范围并将引用保留在其中。使用 Repository 模式从中查询数据。
同样需要注意
每一层都应该保存不同形式的数据。
视图层(即回收器视图)中使用的模型应该只保存视图所需的数据,仅此而已。
演示者和模型层也是如此(通常模型层包含有关模型的最多信息)
这意味着每个模型 class 都需要一个映射器 class 才能从一种形式转换为另一种形式。可以参考this example更好理解
最后
自从我使用 RxJava 以来,我觉得没有必要使用 LiveData,所以我对这个话题了解不够。
您可以查看此full example以了解如何将 MVP 与 RxJava 和 Dagger 一起应用
我希望这对您有所帮助且清晰:)
Should I keep my data in the Repository or should I keep it within the presenter and persist it there somehow?
你有一个有趣的问题,我在开始使用 MVP 时也有过这个问题。这是我的 2 美分:
关于你提到的两个选项,一直在继续讨论。我个人更喜欢存储库模式。它比 IMO 更干净,并且处理诸如当请求已经在飞行中时屏幕旋转等情况变得更容易。此外,每次设备旋转时,您都不需要从数据库中获取。如果您认为这很昂贵,也许您可以在 db 之前创建一个级别的缓存。有一篇非常有趣且详细的文章:Presenters are not for persisting by Mike Nakhimovich, who during his time as Android Developer at New York Times worked on a library called Store 有助于实现相同的目的。来自文章:
I'd propose using data stores which abstract away data loading. Rather than the presenter needing to cache the data, we can leverage the Repository pattern and create Data Providers/Stores that can get data from the network and cache it for when we need it. For one thing, this approach makes it easier to persist your data. Another advantage is that we have a single source of truth for our data. Finally, we can eliminate things like Interactors and just have your Presenter subscribe to your Stores whenever they need something for a view.
希望对您有所帮助。
我正在尝试按照 android 蓝图指南将 MVP 模式实施到我的项目中。目前,我将用户(实体数据)保存在我的 Presenter 中,我真的不喜欢这样做,因为在每次配置更改时,presenter 都会从数据库中获取用户。
我的第一个问题是:
- 我应该将我的数据保存在存储库中(因为我正在使用 dagger 2 并且存储库位于应用程序范围内)还是应该将其保存在演示者中并以某种方式将其保存在那里。我个人希望将它保留在演示器中,但是,我正在尝试学习 w/e 常规方法是。
我也知道 android 架构组件,尤其是 ViewModel,但是,我想保留 MVP 模式而不是 MVVM。
我的第二个问题是:
- 实现持久化后,如何将LiveData与MVP结合使用?
我已经被这个问题困扰了很长一段时间,很想最终解决它。
干杯
Repository 只应充当访问不同数据源数据的大门。
例如
如果您既可以从 API 也可以从磁盘(缓存数据)获取用户数据,则可以在存储库中隔离选择从哪个数据源获取的决策逻辑 class.主持人应该对此一无所知。主持人只要求用户数据
话虽这么说
presenter 需要保存对其查询的数据(即 UserModel)的引用,repo 仅从任何数据源检索数据,仅此而已。这同样适用于任何与数据相关的操作(保存、删除、更新、检索等)。因此,如果您需要保留对数据对象的应用程序范围引用,请创建一个单独的 class 假设命名为 InMemoryStore
并将其标记为应用程序范围并将引用保留在其中。使用 Repository 模式从中查询数据。
同样需要注意
每一层都应该保存不同形式的数据。 视图层(即回收器视图)中使用的模型应该只保存视图所需的数据,仅此而已。 演示者和模型层也是如此(通常模型层包含有关模型的最多信息)
这意味着每个模型 class 都需要一个映射器 class 才能从一种形式转换为另一种形式。可以参考this example更好理解
最后
自从我使用 RxJava 以来,我觉得没有必要使用 LiveData,所以我对这个话题了解不够。
您可以查看此full example以了解如何将 MVP 与 RxJava 和 Dagger 一起应用
我希望这对您有所帮助且清晰:)
Should I keep my data in the Repository or should I keep it within the presenter and persist it there somehow?
你有一个有趣的问题,我在开始使用 MVP 时也有过这个问题。这是我的 2 美分:
关于你提到的两个选项,一直在继续讨论。我个人更喜欢存储库模式。它比 IMO 更干净,并且处理诸如当请求已经在飞行中时屏幕旋转等情况变得更容易。此外,每次设备旋转时,您都不需要从数据库中获取。如果您认为这很昂贵,也许您可以在 db 之前创建一个级别的缓存。有一篇非常有趣且详细的文章:Presenters are not for persisting by Mike Nakhimovich, who during his time as Android Developer at New York Times worked on a library called Store 有助于实现相同的目的。来自文章:
I'd propose using data stores which abstract away data loading. Rather than the presenter needing to cache the data, we can leverage the Repository pattern and create Data Providers/Stores that can get data from the network and cache it for when we need it. For one thing, this approach makes it easier to persist your data. Another advantage is that we have a single source of truth for our data. Finally, we can eliminate things like Interactors and just have your Presenter subscribe to your Stores whenever they need something for a view.
希望对您有所帮助。