我对Observable.just和Observable.fromCallable之间的区别有疑问。
我有一个像这样的“服务”类:
class Service {
var cachedToken: String = ""
get() {
if (needToRefreshToken()) {
refresh() // Can throw Exception!!!
}
return token
}
}
下面的代码调用上面的代码,例如:
Observable.just(service.cachedToken)
.subscribeOn(ioScheduler)
.observeOn(uiScheduler)
.subscribe({ isSuccess ->
view.showSomething()
}, {
view.showError() // this code is never called!!!
})
我希望在“ refresh()”令牌期间发生某些异常时调用“ view.showError()”方法。
但事实并非如此。
所以我更改了Observable.just => Observable.fromCallable,如下所示:
Observable.fromCallable{ service.cachedToken }
.subscribeOn(ioScheduler)
.observeOn(uiScheduler)
.subscribe({ isSuccess ->
view.showSomething()
}, {
view.showError()
})
然后工作正常。
通常情况下,两个代码(just和fromCallable)都可以正常工作。 正确调用了“ view.showSomething()”。 但唯一例外的是,它们的工作方式有所不同
有什么区别?
答案 0 :(得分:1)
just
的行为对于RxJava并不特殊。参数总是在调用方法之前进行求值,所以
Observable.just(service.cachedToken)...
与
相同val x = service.cachedToken
Observable.just(x)...
因此,它仅调用一次cachedToken
的{{1}}。如果get
引发异常,则首先不会到达get
调用,因此您仍然不会得到Observable.just
。
答案 1 :(得分:0)
来自文档
Observable.just
返回一个Observable,对给定的(恒定参考)项进行信号发送 然后完成。
Observable.fromCallable
返回一个Observable,当观察者订阅它时,该Observable调用 您指定的函数,然后发出该函数返回的值 功能。
答案 2 :(得分:0)
如果我们比较SingleJust
和SingleFromCallable
的代码,我们可以看到这里发生了什么。
SinbleJust
@Override
protected void subscribeActual(SingleObserver<? super T> observer) {
observer.onSubscribe(Disposables.disposed());
observer.onSuccess(value);
}
SingleFromCallable
@Override
protected void subscribeActual(SingleObserver<? super T> observer) {
Disposable d = Disposables.empty();
observer.onSubscribe(d);
if (d.isDisposed()) {
return;
}
T value;
try {
value = ObjectHelper.requireNonNull(callable.call(), "The callable returned a null value");
} catch (Throwable ex) {
Exceptions.throwIfFatal(ex);
if (!d.isDisposed()) {
observer.onError(ex);
} else {
RxJavaPlugins.onError(ex);
}
return;
}
if (!d.isDisposed()) {
observer.onSuccess(value);
}
}