MVP 适配器数据缓存
MVP Adapter Data Cache
我正在按照 MVP 架构开发项目。通常,当我使用 recyclerView 时,我的演示者控制适配器数据。但是现在我需要用缓存(或缓存之类的东西)中的数据制作回收器适配器,回收器的大小不取决于缓存大小,所以我通过 HashMap 创建缓存,其中关键是 - 回收器的位置,如果有一个项目map 然后显示数据,否则空行带有 "add events" btn 之类的内容。而且我不知道在这种结构中缓存的位置 - 模型(Dao 或 CacheManager 之类的东西)或在适配器中。
缓存的想法如下:我有一些类型的事件存储在数据库中,每个事件修改都会在数据库中更改它 - 所以缓存也必须更新。
主要问题是:在何处保存此缓存并将其加载到适配器,如何使其与数据库更改保持同步。
P.S。我也尝试使用 RX,所以如果它可以用它解决 - 尝试会非常有趣。
P.P.S 如果是 Repository 模式是解决的方法 - 欢迎。前段时间读过。
你的问题听起来不像是与 RecyclerView.Adapter
相关——实际上你不应该尝试在你的 Adapter
中解决它:适配器的责任是作为一个数据和视图组件之间的桥梁(或 "adapter" ;-) )。赋予它更多的责任会使它变成无法与其他 Adapter
实现互换的东西(你不想要这个!)。
您可能应该找到一种简洁的方法来抽象化数据持久性。内存缓存应该进入那个抽象。您提到了存储库模式,恕我直言,这将是不错的选择。
您的架构大致如下所示:
adapter -> repository -> |-> cache
|-> database
存储库结合了数据访问逻辑(您的 DAO)和缓存处理(您的 CacheManager)。存储库总是首先检查缓存,然后从数据库中获取数据。如果获取了非缓存数据,它还会更新缓存。此外,它在数据库上注册更新。一旦数据库通知更改数据,存储库就有机会更新缓存 and/or 将通知传播到视图。重要的是存储库的接口隐藏了所有这些逻辑;它只提供对数据的访问。
然后您需要找到一种方法让您的适配器与您的存储库一起工作。我建议 Android 的 Loader
机制。通过这种方式,您可以免费获得异步加载和正确的生命周期处理。这也很好地分离了适配器和存储库。
如果您需要一些关于如何应用存储库模式的灵感,请查看 googlesamples/android-architecture Github. The Clean Architecture branch 可能非常适合您。
附带说明:尝试找到数据的真实(唯一)键。使用数据列表中的位置通常不是一个好主意,并且根据数据的结构会在视图中产生奇怪的副作用。
我认为这是一门建筑学科。 Rx 超出主题。例如对于一个存储库,Rx 只是一种实现它的方式,并且通过扩展,它的缓存。
Google 存储库提供了一些架构示例。其中之一包含一个具有基本 mvp 的架构示例,以及一个管理缓存的存储库:
googlesamples/android-architecture/todo-mvp
与 Rx 在同一存储库中的另一个示例:
googlesamples/android-architecture/todo-mvp-rxjava
我们可以看出这两个示例共享相同的架构方案:
我正在按照 MVP 架构开发项目。通常,当我使用 recyclerView 时,我的演示者控制适配器数据。但是现在我需要用缓存(或缓存之类的东西)中的数据制作回收器适配器,回收器的大小不取决于缓存大小,所以我通过 HashMap 创建缓存,其中关键是 - 回收器的位置,如果有一个项目map 然后显示数据,否则空行带有 "add events" btn 之类的内容。而且我不知道在这种结构中缓存的位置 - 模型(Dao 或 CacheManager 之类的东西)或在适配器中。
缓存的想法如下:我有一些类型的事件存储在数据库中,每个事件修改都会在数据库中更改它 - 所以缓存也必须更新。
主要问题是:在何处保存此缓存并将其加载到适配器,如何使其与数据库更改保持同步。
P.S。我也尝试使用 RX,所以如果它可以用它解决 - 尝试会非常有趣。
P.P.S 如果是 Repository 模式是解决的方法 - 欢迎。前段时间读过。
你的问题听起来不像是与 RecyclerView.Adapter
相关——实际上你不应该尝试在你的 Adapter
中解决它:适配器的责任是作为一个数据和视图组件之间的桥梁(或 "adapter" ;-) )。赋予它更多的责任会使它变成无法与其他 Adapter
实现互换的东西(你不想要这个!)。
您可能应该找到一种简洁的方法来抽象化数据持久性。内存缓存应该进入那个抽象。您提到了存储库模式,恕我直言,这将是不错的选择。
您的架构大致如下所示:
adapter -> repository -> |-> cache
|-> database
存储库结合了数据访问逻辑(您的 DAO)和缓存处理(您的 CacheManager)。存储库总是首先检查缓存,然后从数据库中获取数据。如果获取了非缓存数据,它还会更新缓存。此外,它在数据库上注册更新。一旦数据库通知更改数据,存储库就有机会更新缓存 and/or 将通知传播到视图。重要的是存储库的接口隐藏了所有这些逻辑;它只提供对数据的访问。
然后您需要找到一种方法让您的适配器与您的存储库一起工作。我建议 Android 的 Loader
机制。通过这种方式,您可以免费获得异步加载和正确的生命周期处理。这也很好地分离了适配器和存储库。
如果您需要一些关于如何应用存储库模式的灵感,请查看 googlesamples/android-architecture Github. The Clean Architecture branch 可能非常适合您。
附带说明:尝试找到数据的真实(唯一)键。使用数据列表中的位置通常不是一个好主意,并且根据数据的结构会在视图中产生奇怪的副作用。
我认为这是一门建筑学科。 Rx 超出主题。例如对于一个存储库,Rx 只是一种实现它的方式,并且通过扩展,它的缓存。
Google 存储库提供了一些架构示例。其中之一包含一个具有基本 mvp 的架构示例,以及一个管理缓存的存储库:
googlesamples/android-architecture/todo-mvp
与 Rx 在同一存储库中的另一个示例:
googlesamples/android-architecture/todo-mvp-rxjava
我们可以看出这两个示例共享相同的架构方案: