在RxJava MVVM中组合不同的源(FCM,网络,ROOM)

时间:2018-08-25 08:22:23

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

我以前曾使用MediatorLiveData在我的存储库中合并来自FCM,Room和Networking的结果。运行良好。但是,现在我想从RxJava获得更多的复杂性和一些额外的好处。这就是为什么我这次决定使用RxJava的原因。我可以将Room和Networking与 Observable.concatArrayEager(我的_observables)结合使用。但是,现在我不打算在FCM提升价值之后执行此操作,并且在发生新更改后如何通知我的主要可观察对象?在这个问题上没有任何例子。这是至关重要的部分。我在BroadCastReceiver中接收了FCM,然后通知了存储库的实时数据,通知了我的MediatorLiveData ... 如何使用RxJava做到这一点?真的很欢迎任何建议,因为这确实很重要。

2 个答案:

答案 0 :(得分:1)

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

使用数据库作为单一事实来源绝对容易。

房间支持Flowable,例如:

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

每次对表Users进行任何更新时,Room都会在您订阅后自动发出更新的用户。

以下方法可能会为您提供帮助:

  1. 在您Activity / Fragment中,订阅Flowable
  2. 一旦收到FCM通知,请调用网络api并更新数据库。
  3. 使用更新的数据。

无论如何,如果您需要合并来自不同Observable的项目集,则可以使用zip

答案 1 :(得分:0)

public class ExtraWork { public List<string> TopRecommended { get; set; } public List<string> OtherCourses { get; set; } } public class Details { public string description { get; set; } public string collegeCode { get; set; } } public class Course { public string smalldesc { get; set; } public Details Details { get; set; } } public class RootObject { public string Studentid { get; set; } public string Grade { get; set; } public ExtraWork ExtraWork { get; set; } public List<Course> Courses { get; set; } } 运算符按照指定的顺序发出可观察对象,这意味着第二个可观察对象要等到第一个可观察对象完成发射对象后才开始发射。

但是使用merge运算符,您可以将所需的多个可观察值合并为一个可观察值。例如:

concat

P.S:如果您想从数据源中获取数据并使用Observable.merge(dbObservable, webObservable, fcmObservable) .subscribe(item -> System.out.println(item)); 保持最新,则可以执行以下操作:

fcm

这些模式很少,fcmObservable .startWith(dbObservable) .subscribe(item -> System.out.println(item)); 总是没有不可能的,根据您想做的事,总会有更好的RxJava来完成工作!