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