【问题标题】:MVP Adapter Data CacheMVP 适配器数据缓存
【发布时间】:2017-04-21 06:59:16
【问题描述】:

我正在开发遵循 MVP 架构的项目。通常,当我使用recyclerView 时,我的presenter 控制Adapter 数据。但是现在我需要使用来自缓存(或类似缓存)的数据制作回收器适配器,回收器的大小不取决于缓存大小,所以我通过 HashMap 进行缓存,其中关键是 - 回收器的位置,如果有一个项目映射然后数据显示,否则为“添加事件”btn之类的空行。而且我无法意识到该缓存在这种结构中的位置 - 模型(Dao 或类似 CacheManager 的东西)或适配器中。

缓存的想法如下:我有一些类型的事件存储在数据库中,每个事件修改都会在数据库中更改它 - 所以缓存也必须更新。

主要问题是:在哪里保存这个缓存并将其加载到适配器,我如何让它与数据库更改保持同步。

附:我也尝试使用 RX,所以如果可以用它解决 - 尝试会很有趣。

P.P.S 如果它是存储库模式的解决方法 - 欢迎。前段时间读过。

【问题讨论】:

    标签: android caching mvp


    【解决方案1】:

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

    您可能应该找到一种简洁的方法来抽象您的数据持久性。内存中的缓存应该进入那个抽象。您提到了存储库模式,恕我直言,这将是不错的选择。

    您的架构应该大致如下所示:

    adapter -> repository -> |-> cache
                             |-> database
    

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

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

    如果您需要有关如何应用存储库模式的一些灵感,请查看googlesamples/android-architecture Github。 Clean Architecture branch 可能非常适合您。

    附带说明:尝试找到数据的真实(唯一)键。使用数据列表中的位置通常不是一个好主意,并且根据数据的结构会导致视图中出现奇怪的副作用。

    【讨论】:

    • 但是在没有 Presenter 的情况下使用来自 Adapter 的 Repository 不是一个坏习惯吗?我已经在 DAO 类中实现了我的缓存,并从 Adapter 中调用了它,但是“我对此有一种不好的感觉”。附:我的关键不是一个简单的位置,它只取决于位置。 f(位置)=键
    • 你是对的。这就是我建议使用加载器的原因:(1)您的演示者处理加载器(初始化、结果回调等); (2)Loader从repository加载数据; (3)presenter取Loader的result回调,将数据交给adapter
    • 好吧,我用 Rx 代替 Loadres。所以我有了初始化的想法,但是 ViewHolders 的操作呢?我应该在我的适配器中创建接口,然后在 Fragment\Activity 或 Presenter oO 中实现吗?还是有更好的沟通方式? RxBus(EventBus)?
    • 现在您已经深入了解了这里的细节;-) 当然,您需要以某种方式将 UI 事件传播给您的演示者。如果您已经在使用 Rx,那么利用它来实现这一点听起来很合理。但是如何使用 Rx 处理 UI 事件可能值得提出一个新问题(我敢打赌已经有一些好的问题了)。
    【解决方案2】:

    我认为这是一门建筑学科。 Rx 不在主题范围内。例如,对于存储库,Rx 只是一种实现它的方式,并且通过扩展,它的缓存。

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

    googlesamples/android-architecture/todo-mvp

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

    googlesamples/android-architecture/todo-mvp-rxjava

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

    【讨论】:

    • 是的,我已经理解了缓存数据的想法)最后一个我不清楚的问题是如何连接Adapter和Presenter?对上一个答案的评论
    • @shagi 恕我直言,在您的演示者中,您调用您的存储库或业务逻辑来获取数据(您可以在此处使用 Rx)。演示者从片段中调用一个方法来传输数据。片段实现适配器及其逻辑。适配器/片段监听 UI 事件(你可以在这里使用 Rx)并调用 Presenter 的方法。演示者包含在 UI 事件之后执行某些操作的逻辑。
    • 详细信息来自与 Rx 相同的示例。片段和适配器(此处未使用 Rx!如果您在此处使用 rx,则用于 UI 事件):github.com/googlesamples/android-architecture/blob/… - Presenter(此处使用 Rx 订阅存储库的观察者):github.com/googlesamples/android-architecture/blob/…
    猜你喜欢
    • 2021-09-13
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多