草庐IT

android - 当 Room 没有 LiveData 而不是从 REST API 获取时返回 LiveData 的存储库

coder 2023-12-29 原文

我正在寻找处理以下用例 w.r.t. 的建议。实时数据处理: ViewModel 为 LiveData 调用存储库(例如产品目录)。存储库首先从 LocalDataSource(Room) 检查,但如果数据不可用,则调用 RemoteDataSource(REST API)。

问题:

1) 根据 yigit here 的以下评论, Repository 在以观察者身份订阅之前无法获取 Room 中的 LiveData 可用性状态。因此,即使数据可用,我也会得到 null 作为响应。 “LiveData就是看数据,然后分发给观察者,直到有活跃的观察者加入,它才会计算值(value)。”

由于 Repository 向客户端隐藏了数据源,因此 Repository 有责任 checkin Room,然后从 Remote Source 拉取数据。它如何检查 Room 中的数据可用性?

2) 由于 RemoteDataSource 返回的数据不是 LiveData 类型,应该怎么做才能使存储库最终将 LiveData 返回给 ViewModel?

Repository 是否应该首先将数据(来自 RemoteDataSource)插入 Room,然后查询 Room 以便它返回 LiveData?它看起来相当昂贵的操作,因为在此过程中 Room 被查询了两次。请指教 。谢谢!

最佳答案

首先感谢@adityakamble49回答我的问题,归功于他! 您可以通过将 LiveData 作为返回值并使用 NetworkBoundResource 来使用 Repository 维护抽象你可以决定是否需要从网络中获取或者你可以使用缓存数据(DB/DataHolder)。 NetworkBoundResource 是一种在抽象类中实现通用功能(使用泛型)并在扩展类中提供显式行为的简洁方法。

NetworkBoundResource 上分享我的观点类与 android-priority-jobqueue所以它可以帮助我们决定在各种情况下使用哪一个。

NetworkBoundResource - 当应用需要从本地数据库或网络获取数据时使用,但在获取失败(例如没有网络)时向用户显示错误。在屏幕上拉动以刷新是一个很好的用例,用户希望看到更新的数据,或者如果获取失败则看到错误提示框/对话框。

android-priority-jobqueue - 在许多情况下,需要保留操作直到它成功完成(而不是显示错误并忘记)。 JobQueue 在这种情况下有很大帮助,可以在后台队列中维护挂起的作业(用于关联的触发器),然后在网络可用时处理它们。例如。用户在离线模式下创建的笔记被添加到 JobQueue 中,稍后在设备上线时同步。 NetworkBoundResource 无法解决这种情况。

不应使用 JobQueue 处理 NetworkBoundResource 候选操作(反之亦然),因为它可能会用太多操作淹没 JobQueue,并且其中许多可能是重复的,例如同一屏幕上的多个拉动刷新操作导致多个作业,这是错误的。欢迎其他人的观点!!!

关于android - 当 Room 没有 LiveData 而不是从 REST API 获取时返回 LiveData 的存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48972343/

有关android - 当 Room 没有 LiveData 而不是从 REST API 获取时返回 LiveData 的存储库的更多相关文章

  1. ruby - 难道Lua没有和Ruby的method_missing相媲美的东西吗? - 2

    我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/

  2. ruby-on-rails - rails 目前在重启后没有安装 - 2

    我有一个奇怪的问题:我在rvm上安装了ruby​​onrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(

  3. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  4. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  5. 没有类的 Ruby 方法? - 2

    大家好!我想知道Ruby中未使用语法ClassName.method_name调用的方法是如何工作的。我头脑中的一些是puts、print、gets、chomp。可以在不使用点运算符的情况下调用这些方法。为什么是这样?他们来自哪里?我怎样才能看到这些方法的完整列表? 最佳答案 Kernel中的所有方法都可用于Object类的所有对象或从Object派生的任何类。您可以使用Kernel.instance_methods列出它们。 关于没有类的Ruby方法?,我们在StackOverflow

  6. ruby-on-rails - Rails 3,嵌套资源,没有路由匹配 [PUT] - 2

    我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle

  7. ruby-on-rails - 有没有办法为 CarrierWave/Fog 设置上传进度指示器? - 2

    我在Rails应用程序中使用CarrierWave/Fog将视频上传到AmazonS3。有没有办法判断上传的进度,让我可以显示上传进度如何? 最佳答案 CarrierWave和Fog本身没有这种功能;你需要一个前端uploader来显示进度。当我不得不解决这个问题时,我使用了jQueryfileupload因为我的堆栈中已经有jQuery。甚至还有apostonCarrierWaveintegration因此您只需按照那里的说明操作即可获得适用于您的应用的进度条。 关于ruby-on-r

  8. ruby - 没有类方法获取 Ruby 类名 - 2

    如何在Ruby中获取BasicObject实例的类名?例如,假设我有这个:classMyObjectSystem我怎样才能使这段代码成功?编辑:我发现Object的实例方法class被定义为returnrb_class_real(CLASS_OF(obj));。有什么方法可以从Ruby中使用它? 最佳答案 我花了一些时间研究irb并想出了这个:classBasicObjectdefclassklass=class这将为任何从BasicObject继承的对象提供一个#class您可以调用的方法。编辑评论中要求的进一步解释:假设你有对象

  9. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

  10. ruby - 没有轨道的 ActiveRecord 时区 - 2

    我在非Rails项目中使用ActiveRecord。在Rails中,我可以这样做:config.time_zone='EasternTime(US&Canada)'config.active_record.default_timezone='EasternTime(US&Canada)'但如果我不使用rails,我该如何设置时区? 最佳答案 ActiveRecord::Base.default_timezone='EasternTime(US&Canada)' 关于ruby-没有轨道的A

随机推荐