RxJava Observable.just与Observable.fromCallable有什么区别?

时间:2019-07-26 06:40:45

标签: android kotlin rx-java rx-java2

我对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()”。 但唯一例外的是,它们的工作方式有所不同

有什么区别?

3 个答案:

答案 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)

如果我们比较SingleJustSingleFromCallable的代码,我们可以看到这里发生了什么。

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);
    }
}