我是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方法是什么?
答案 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));
}
});