RxJava模式用于返回冷结果,做更多工作,然后返回热结果

时间:2016-11-07 12:20:20

标签: android design-patterns rx-java

我正在学习RxJava,所以请保持温柔。我已经看了教程,完成了阅读,搜索了SO,但是,我仍然在改变我的Observable时遇到了一些问题。出于某种原因,我无法找到一个操作员模式来完成我的任务(虽然我认为它是一个常见的)。我想要做的是以下内容:返回我的片段可以订阅的Observable。可观察者应在订阅时执行以下操作:

1)通过执行2次查询,运行一些逻辑并返回结果,从本地数据库中获取数据; 2)从API获取数据;
3)将新API数据与数据库同步;
4)重复第一步并返回结果;

到目前为止,我已经转换了我的db调用和我的API调用以返回observable。我试图了解如何能够散发出冷酷的结果并继续保持链条。我可以分别保留这两个操作,并使用相同的订阅者订阅这两个操作?但是我不确定如果我的新加载器替换类返回一个可观察的东西会如何工作...而且我真的不需要处理来自第二个observable的结果 - 我只需要第一个当第二个完成时重播。

到目前为止,我有以下内容:

hotStuff

假设我还有getColdStuff()将执行API调用以及与数据库同步(如果这是正确的方法),并返回相同的getHotStuff()。但是,我仍然坚持下一步 - 如果getColdStuff()完成,我怎样才能重新启动第一个observable重播,而无需添加其他订阅者?

修改

我已经取得了一些进展,我认为我现在需要的是加入所有这些。我有两种方法:

1)getHotStuff()几乎如上所述 2)getHotStuff()将调用API,与数据库同步,并返回一个Observable。我的想法是在getColdStuff()完成后再次调用BehaviorRelay<Observable<StuffFetchResult>> callSequence = BehaviorRelay.create(); Observable<StuffFetchResult> valueSequence = Observable.switchOnNextDelayError(callSequence.toSerialized()); valueSequence.subscribe(new Subscriber<StuffFetchResult>() { @Override public void onCompleted() {} @Override public void onError(Throwable e) {} @Override public void onNext(StuffFetchResult result) { // UI stuff } }); callSequence.call(loader.getColdStuff()); 以刷新UI,因此可以忽略从valueSequence返回的实际结果。它所需要做的就是在完成后触发callSequence.call(loader.getColdStuff());

我在答案中尝试了这个建议并创建了以下内容:

onNext()

我可以在这里订阅getHotStuff()并使用getHotStuff(),这将运行第一个方法,并在我订阅的Observable中生成结果,我可以将其用于我的UI。但是,我不确定如何并行运行callSequence,并在返回时对其执行不同的操作。另外 loader.getHotStuff() .subscribeOn(Schedulers.io()) .subscribe( new Subscriber<Object>() { @Override public void onCompleted() {} @Override public void onError(Throwable e) {} @Override public void onNext(Object stuffWeDontCareAbout) { callSequence.call(loader.getColdStuff()); } }); 会返回不同类型的{{1}},因此我无法真正使用相同的{{1}}吗?

编辑2

使用两个订阅者,我可以实现我想要的行为。不确定这是不是正确的方法。

{{1}}

1 个答案:

答案 0 :(得分:0)

如果我理解你的情况,你可能想要这样的东西 -

BehaviorSubject<Observable<T> callSequence = BehaviorSubject.create();
Observable<T> valueSequence = Observable.swithOnNextDelayError(callSequence.toSerialized());

您的订阅者将收听 valueSequence ,并且只要您需要重新启动&#34;,您就会调用它 -

callSequence.onNext(call.cache()); // *call* is Observable<T>

(我将.subscribeOn / .observeOn配置留给您)