【问题标题】:Combining different sources in RxJava MVVM (FCM, Networking, ROOM)在 RxJava MVVM(FCM、网络、ROOM)中组合不同的源
【发布时间】:2019-01-31 13:50:42
【问题描述】:

我之前使用 MediatorLiveData 将 FCM、Room 和 Networking 的结果合并到我的存储库中。它运作良好。然而,现在我想要更多的复杂性和来自 RxJava 的一些额外的好处。这就是我这次决定使用 RxJava 的原因。我可以将 Room 和 Networking 与 Observable.concatArrayEager(my _observables) 结合使用。 但是,我现在不知道在 FCM 推送值之后如何执行此操作,以及在发生新更改后我应该如何通知我的主要 observable ?没有任何关于这个问题的例子。这是至关重要的部分。我在我的 BroadCastReceiver 中收到 FCM,然后通知了我的存储库的 livedata,它通知了我的 MediatorLiveData...如何使用 RxJava 做到这一点?非常欢迎任何建议,因为这是非常重要的问题。

【问题讨论】:

    标签: android mvvm rx-java android-architecture-components android-livedata


    【解决方案1】:

    恕我直言,您不需要合并来自不同来源的数据。

    使用数据库作为您的单一事实来源肯定更容易。

    房间支持Flowable点赞:

    @Query(“SELECT * FROM Users WHERE id = :userId”)
    Flowable<User> getUserById(String userId);
    

    每次Users 表有任何更新,Room 将在您订阅后自动发出更新的用户。

    以下方法可能对您有所帮助:

    1. 在你Activity / Fragment,订阅Flowable
    2. 收到 FCM 通知后,调用 network api 并更新 db。
    3. 使用更新后的数据。

    无论如何,如果你需要组合来自不同 Observables 的项目集合,你可以使用zip

    【讨论】:

    • 是的,经过大量搜索后,我得出结论,最好使用本地数据库作为单一事实来源……但是,我仍然对如何将不同的 observable 组合成一个 observable 感兴趣。我发现在我的情况下只有合并有效,但它仍然没有提供最新的价值,只有一个旧的。
    • 所以你需要两个 observables 的结果?如果是,那么您可以使用zip 将它们合二为一。
    • 不,我只需要最新的。三个可观察对象(网络、房间和 FCM)中的每一个都包含特定数据,如果用户在线,则获取最新数据的那个应该是正确的可观察对象,如果他离线,我将显示房间可观察对象。
    • 似乎您正在选择可观察但将它们组合起来。 val selectedObservable = if (...) observableA() else observableB() 然后val mainObservable = Observable.just(selectedObservable)
    • 也许我不是很流利,但我需要在另一个 observable 发生变化时覆盖我的 MainObservable。此外,您将数据保存到房间的方法也不能完全奏效...... Room 只提供 Flowable,而我需要变得可观察......
    【解决方案2】:

    concat 操作符按照指定的顺序发射 observables,这意味着第二个 observable 在第一个 observable 完成发射对象之前不会开始发射。

    但是使用merge 运算符,您可以将任意数量的可观察对象组合成一个可观察对象。例如:

    Observable.merge(dbObservable, webObservable, fcmObservable)
        .subscribe(item -> System.out.println(item));
    

    P.S:如果您想从数据源获取数据并使用 fcm 使其保持最新状态,您可以这样做:

    fcmObservable
            .startWith(dbObservable)
            .subscribe(item -> System.out.println(item));
    

    这些只是少数可用的模式,在RxJava 中始终没有什么是不可能的,根据您想做的事情,总会有更好的RxChain 来完成这项工作!

    【讨论】:

      猜你喜欢
      • 2018-10-14
      • 1970-01-01
      • 1970-01-01
      • 2018-01-12
      • 2017-02-02
      • 2017-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多