链接Observables没有重要的返回值

时间:2015-06-05 10:33:38

标签: java android rx-java observable

我很高兴在我的应用程序中使用RxJava进行Retrofit,但我不知道如何正确链接除了告诉调用成功之外没有真正返回任何内容的网络调用。

一个例子是将所有更新的项目发送到服务器的功能。首先,我想调用loginManager.refreshLogin()然后调用synchronizeInventories()synchronizeItems(),等待它们都完成并返回指示可以更新UI的内容。

现在,该功能如下所示:

public Observable<List<Object>> synchronize() {
    return loginManager.refreshLogin()
                    .flatMap(o -> Observable.merge(
                            synchronizeInventories(),
                            synchronizeItems()
                    ))
                    .toList();
}

refreshLogin()返回Observable.just(new Object())synchronizeInventories()synchronizeItems()返回Observable.empty()

现在一切正常,但我认为这不是正确的做法。

2 个答案:

答案 0 :(得分:1)

Observable<List<Object>>被返回,因为synchronizeInventories()synchronizeItems()返回不同类型的对象,因此.merge()会返回Observable<Object>

如果两个方法都返回相同的对象,那么你就是一个特定的类,例如:

.flatMap(o -> Observable.merge(Observable.just("a"), Observable.just("b")))
.doOnNext(new Action1<String>() {
    @Override
    public void call(String s) {

    }
 })

避免使用常规Object类的一种方法是使用.zip()并使用帮助Pair<>类:

.flatMap(o -> Observable.zip(just("a"), just(123), (s, s2) -> new Pair<>(s, s2)))
.doOnNext(pair -> {
    pair.first // get the first object
    pair.second // geth the second
});

答案 1 :(得分:0)

您可以简单地使用concat来串行执行多个Observable。

    final Observable flowObs = Observable.concat(obs1, obs2, obs3);
    flowObs.subscribe(); //will first execute the subscriber function on obs1, then on obs2, then on obs3