使用带有Maybe的zip()可能不会发出值

时间:2017-07-20 13:50:04

标签: android observable rx-java2

我正在尝试一次执行两个Maybe并在完成两个任务后调用特定方法。如果两个Observable都返回一个值,但是在某些情况下,一个可能不会发出一个项,因此只调用doOnComplete而不是doOnSuccess。因此,如果其中一个Maybes'未调用doOnSuccess zip()块未执行。我想知道如何处理这种情况?

按照我的代码(剥离到必要部分):

private void fetchData(){
    Maybe<Integer> maybeOne = getId(); // may return Maybe.empty()
    Maybe<List<String>> maybeTwo = getList();
    Maybe.zip(maybeOne, maybeTwo, (id, list) -> {
        initView(id, list); // only called if values have been emitted
        return true;
    }).subscribe();
}

我希望始终调用zip()块,但如果Maybe没有调用onSuccess,则使用null值。情况并非如此,我可以处理这种情况吗?

1 个答案:

答案 0 :(得分:8)

您可以使用materialize运算符。它基本上将串行调用转换为对象(包含在Notification对象中)。

Observable.zip(maybeOne.toObservable().materialize(),
                maybeTwo.toObservable().materialize(), (id, list) -> {
                    Log.d(TAG, "zip completed");
                    return true;
                }).subscribe();

现在您的zip将始终“完成”,但您的真实数据可以使用以下方式检索:

id.getValue()

如果你的可能是Maybe.empty(),那么它不会返回值,而是null。