RxJava Single.just()vs Single.fromCallable()?

bas*_*i82 14 java android rx-java2

我想知道是否有人可以对这个问题有所了解,何时使用

__CODE__

代替

__CODE__ ?


来自文档Single.formcallable

Single.fromcallable(()-> myObject)
Run Code Online (Sandbox Code Playgroud)

和Single.just的文件

Single.Just(myObject)
Run Code Online (Sandbox Code Playgroud)

laa*_*lto 28

通常,当您发出的东西不仅仅是一个对象,而实际上是一些涉及繁重计算,I/O或状态的方法调用的结果时,您会注意到差异.

Single.just(x)x在当前线程中立即对其进行评估,然后x为所有订阅者留下任何结果.

Single.fromCallable(y)y在subscribeOn订阅时调用调度程序中的可调用对象,并为每个用户单独调用.


因此,例如,如果您想将I/O操作卸载到后台线程,则可以使用

Single.fromCallable(() -> someIoOperation()).
    subscribeOn(Schedulers.io()).
    observeOn(AndroidSchedulers.mainThread()).
    subscribe(value -> updateUi(value), error -> handleError(error));
Run Code Online (Sandbox Code Playgroud)

有Single.just()在这里,因为是行不通的someIoOperation()将当前线程上执行.

  • 感谢您的简洁解释。这应该是公认的答案。 (2认同)

Ahm*_*mal 15

在你提到的用例中,实际上没有重大区别.

如果我们需要通过函数调用动态创建对象怎么办?

fun getTimeObject() {
    val timeInMillis = System.currentTimeMillis()
    return TimeObject(timeInMillis)
}
Run Code Online (Sandbox Code Playgroud)

然后,Single.just(getTimeObject())结果Single将Long在有新订户时发出相同的结果.

然而,Single.fromcallable(()-> getTimeObject())由此产生的结果Single将发出不同的信号,Long表示当它有新订户时以毫秒为单位的当前时间.

那是因为fromCallable每次有一个新订阅者Lazily时执行它的lambda .

  • 我发现这个例子非常好,因为它在很短的行中显示了这两个函数之间的显着差异。应该写进教科书! (2认同)