RxJava:从Nullable对象创建observable

时间:2017-10-10 10:13:00

标签: android rx-java2

我是RxJava的新手。我有这样的代码。我正在从repository.getStatus()返回的字符串中创建一个observable。如果它为null,我必须继续执行proceed方法而不做任何事情。如果它不为空,我必须致电repository.init()然后proceed。这就是我所做的。

Flowable.just(repository.getStatus()) // getStatus return a string , which can be null
        .doOnError(throwable -> proceed())
        .flatMapCompletable(s -> repository.init())
        .observeOn(Schedulers.io())
        .subscribeOn(AndroidSchedulers.mainThread())
        .subscribe(new DisposableCompletableObserver() {
                       @Override
                       public void onComplete() {
                           proceed();
                       }

                       @Override
                       public void onError(@NonNull Throwable e) {
                            handleErrors(t));
                       }
                  });

private void proceed(){
    // 
}

如果repository.getStatus()为空,请不要调用doOnError(throwable -> proceed())? 现在它在repository.getStatus()为空时崩溃。处理这种用例的最佳Rx方法是什么?

2 个答案:

答案 0 :(得分:1)

由于您使用的是Rx2,因此可以使用新的Maybe类型,即Optional的流媒体等效项。不幸的是,它没有fromNullable工厂方法(请参阅https://github.com/ReactiveX/RxJava/issues/5019),但您可以使用此方法:

Maybe.fromCallable(() -> repository.getStatus())

答案 1 :(得分:0)

您可以根据条件从这两个中的任意一个创建一个observable,而不是使用repository.getStatus()来管道repository.init()

尝试这样的事情

    Flowable.just(repository.getStatus() == null ? Completable.complete() : repository.init())
            .flatMapCompletable(c -> c)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new DisposableCompletableObserver() {
                @Override
                public void onComplete() {
                    proceed();
                }

                @Override
                public void onError(@NonNull Throwable e) {
                     handleErrors(t));
                }
            });

你甚至可以将你的repository.getStatus()作为MayBe来做这样的事情

Maybe.create((MaybeOnSubscribe<String>) e -> {
        if (repository.getStatus() != null) e.onSuccess(repository.getStatus());
        e.onComplete();
    }).flatMapCompletable(s -> Completable.fromAction(() -> repository.init()))
            .subscribe(new DisposableCompletableObserver() {
                @Override
                public void onComplete() {
                    proceed();
                }

                @Override
                public void onError(@NonNull Throwable e) {
                    handleErrors(t));
                }
            });