Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android MVP适配器数据缓存_Android_Caching_Mvp - Fatal编程技术网

Android MVP适配器数据缓存

Android MVP适配器数据缓存,android,caching,mvp,Android,Caching,Mvp,我正在按照MVP架构开发项目。通常,当我使用recyclerView时,演示者控制适配器数据。但现在我需要使用缓存(或类似缓存的东西)中的数据制作回收器适配器,回收器的大小不取决于缓存大小,因此我通过HashMap制作缓存,其中键是-回收器的位置,如果在映射中有一个项,则数据显示,否则将显示空行,类似于“添加事件”btn。我不知道这种结构模型(Dao或类似CacheManager的东西)或适配器中缓存的位置在哪里 缓存的思想如下:我有一些类型的事件存储在数据库中,每次修改事件都会在数据库中更改它

我正在按照MVP架构开发项目。通常,当我使用recyclerView时,演示者控制适配器数据。但现在我需要使用缓存(或类似缓存的东西)中的数据制作回收器适配器,回收器的大小不取决于缓存大小,因此我通过HashMap制作缓存,其中键是-回收器的位置,如果在映射中有一个项,则数据显示,否则将显示空行,类似于“添加事件”btn。我不知道这种结构模型(Dao或类似CacheManager的东西)或适配器中缓存的位置在哪里

缓存的思想如下:我有一些类型的事件存储在数据库中,每次修改事件都会在数据库中更改它-因此缓存也必须更新

主要问题是:在何处保留此缓存并将其加载到适配器,如何使其与数据库更改保持同步

另外,我也尝试使用RX,所以如果能用它来解决问题,那将是非常有趣的尝试


p.p.S如果它是存储库模式,那么它是解决问题的方法-欢迎使用。前一段时间读过。

您的问题听起来与
RecyclerView.Adapter
无关,实际上您不应该试图在
适配器中解决它:适配器的责任是充当数据和视图组件之间的桥梁(或“适配器”;-)。赋予它更多的责任会使它变成无法与其他
适配器
实现互换的东西(您不希望这样!)

您可能应该找到一种干净的方法来抽象数据持久性。内存中的缓存应该进入该抽象。您提到了存储库模式,这将是一个很好的选择

您的体系结构大致如下所示:

adapter -> repository -> |-> cache
                         |-> database
存储库结合了数据访问逻辑(DAO)和缓存处理逻辑(CacheManager)。存储库总是首先检查缓存,然后从数据库中获取数据。如果提取了非缓存数据,它还会更新缓存。此外,它在数据库上注册更新。一旦数据库通知更改的数据,存储库就有机会更新缓存和/或将通知传播到视图。重要的是,存储库的接口隐藏了所有这些逻辑;它只提供对数据的访问

然后,您需要找到一种方法使适配器与存储库一起工作。我建议Android的
加载器
机制。通过这种方式,您可以免费获得异步加载和正确的生命周期处理。这也很好地解耦了适配器和存储库

如果您需要一些关于如何应用存储库模式的启示,请查看Github。这个可能很适合你


另一方面:试着找到数据的真实(唯一)键。使用数据列表中的位置通常是个坏主意,根据数据的结构,会在视图中产生奇怪的副作用。

我认为这是一个架构主题。Rx不在主题范围内。例如,对于存储库来说,Rx只是实现它的一种方式,并扩展到它的缓存

Google存储库提供了一些架构示例。其中一个包含一个具有基本mvp的体系结构示例,以及一个管理缓存的存储库:

与Rx在同一存储库中的另一个示例:

我们可以在这里看到,这两个示例共享相同的架构方案:


但是在没有演示者的情况下从适配器使用存储库不是一种糟糕的做法吗?我已经在DAO类中实现了我的缓存,并从适配器中调用了它,但“我对此感觉不好”。我的钥匙不是一个简单的位置,它只是取决于位置。f(位置)=键你是对的。这就是我建议使用加载器的原因:(1)演示者处理加载器(初始化、结果回调等);(2) 加载程序从存储库加载数据;(3) 演示者接受加载程序的结果回调,并将数据交给adapterOk,而不是我使用Rx的加载程序。我已经有了初始化的想法,但是来自viewholder的操作呢?我应该在适配器中创建接口,然后在Fragment\Activity或Presenter oO中实现吗?还是有更好的沟通方式?RxBus(EventBus)?现在您将在这里详细了解;-)当然,您需要以某种方式将UI事件传播给演示者。如果您已经在使用Rx,那么也可以利用它来实现这一点。但如何使用Rx处理UI事件可能值得一提新问题(我打赌已经有一些好问题了)。是的,我已经理解了缓存数据的想法。最后一个我不清楚的问题是如何连接适配器和演示者?对上一篇文章的评论answer@shagiIMHO,在演示者中,您可以调用存储库或业务逻辑来获取数据(您可以在此处使用Rx)。演示者从片段调用方法来传输数据。片段实现了适配器及其逻辑。适配器/片段侦听UI事件(您可以在此处使用Rx)并调用presenter的方法。演示者包含在UI事件之后执行某些操作的逻辑。详细信息来自Rx的同一示例。片段和适配器(此处未使用Rx!如果您在此处使用Rx,则用于UI事件):-Presenter(此处使用Rx订阅存储库的观察者):