当前位置: 首页 > 知识库问答 >
问题:

Rx改造室-单人和流动组合

范宏大
2023-03-14

我有以下问题:

我需要一张单人床

我尝试过使用zip运算符,因为这是一种常见的方法,但zip的问题是它会等待来自两个来源的数据——这意味着每次我从Room获得新数据时,zip不会传播任何新的emmision,因为它还需要来自Retrofit的新数据。

我目前的解决方案是这个,使用组合最新:

Flowable<UiModel> getData() {
    return Flowable.combineLatest(networkService.getUsers().toFlowable(),
          roomDao.getBooks(), UiModel::success)
            .onErrorReturn(UiModel::error)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .startWith(UiModel.loading());
}

这是有效的,但有几个小问题。首先,UiModel有多个排放。这是组合最新的预期——我从数据库中获取第一个包含数据的模型,然后在网络请求完成时获取第二个模型。我知道我可以使用skip(1)运算符跳过第一个排放,但我尝试用本地缓存替换我的网络服务,当两个数据源在相同(相似?)时间完成时,组合最新似乎只发出一个UiModel。

有没有更好的方法来实现我想要的?

编辑:我已添加。onErrorReturn之前distinctUntilChanged运算符。我认为这应该能解决任何问题。

共有1个答案

尉迟明贤
2023-03-14

如果您使用Flowable和网络呼叫将房间的订阅拆分,会怎么样?

创建视图时从Room获取缓存数据,如果有数据,您可以将其显示给用户(带有一些时间戳以指示数据已缓存)

同时向网络发出请求(这个可以留在后台线程上)并让您的网络服务将返回的数据插入表中。如果数据不同,它将更新条目,Flowable将发出,如果数据是同一个表,则不会更新并且Flowable不会发出。

分割的原因是为了更好地控制可观测流,其中一个只发射一次,另一个每次发生变化时都发射一次。

 类似资料:
  • 我有一个项目,使用改造映射API 2.0.2. 它工作得很好,所以我决定写一些功能测试,以确保它在将来正常工作。出于多方面的原因,我希望他们用完任何Android设备或模拟器。 问题是,我使用了一些Android类(比如Base64),所以我需要一个环境,这就是为什么我决定使用Robolector3.0。 为了伪造我的API(纯单元测试)的响应,我使用了OkHttp拦截器,几乎在所有地方都有解释。

  • 我在使用rx android和改型时遇到网络线程异常。这是我的代码: 我们必须在完成http调用后取消订阅吗。知道吗? 异常如下所示。我在代码中的postdata方法的onError上得到这个异常:

  • 给定一个可观测的源S,我如何要求RxJava/Rx生成可观测的D,即: 毫无延迟地从S发出第一个项目 在发射每个项目之后和发射下一个项目L之前等待至少T秒,其中L是S在等待期间发射的最后一个项目 如果S在等待期间T(从点#2开始)没有产生任何项目,则在它在S中应用后立即发出下一个项目 大理石图: 我想使用: 示例运算符,但它不满足#3的要求 Debounce运算符,但它也不满足#3的要求 Thro

  • 本文向大家介绍C#制作简单的多人在线即时交流聊天室,包括了C#制作简单的多人在线即时交流聊天室的使用技巧和注意事项,需要的朋友参考一下 实现网页版的在线聊天室的方法有很多,在没有来到HTML5之前,常见的有:定时轮询、长连接+长轮询、基于第三方插件(如FLASH的Socket),而如果是HTML5,则比较简单,可以直接使用WebSocket,当然HTML5目前在PC端并没有被所有浏览器支持,所以我

  • 本文向大家介绍python实现简单多人聊天室,包括了python实现简单多人聊天室的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了python实现多人聊天室的具体代码,供大家参考,具体内容如下 刚开始学习python,写了一个聊天室练练手。 Server.py client.py 运行时先启动服务端。进入聊天室先起一个昵称。服务端会向客户端发送当前聊天室内聊天人的列表。一个客户端发出

  • 我的存储库中有一个方法: 此方法从api收集结果,然后将结果保存到数据库中,并返回一个flowable,其中这些位置按id从数据库中检索为: 现在,每次我改变其中的一个对象,我可以看到整个我的应用程序的变化。 为什么会这样?nt应该把这两种来源的排放结合起来吗?