rx-java - RxJava2 Completable.fromAction() 和 Completable.fromCallable() 的区别?

标签 rx-java rx-java2

我们什么时候应该使用 Completable.fromAction()我们什么时候应该使用 Completable.fromCallable()是否有特定的用例

从文档看来,两者都做同样的事情,很难注意到它们之间的区别。

Completable.FromAction
enter image description here

Completable.fromCallable
enter image description here

最佳答案

真的没有什么区别。这是代码:

public final class CompletableFromAction extends Completable {

    final Action run;

    public CompletableFromAction(Action run) {
        this.run = run;
    }

    @Override
    protected void subscribeActual(CompletableObserver observer) {
        Disposable d = Disposables.empty();
        observer.onSubscribe(d);
        try {
            run.run();
        } catch (Throwable e) {
            Exceptions.throwIfFatal(e);
            if (!d.isDisposed()) {
                observer.onError(e);
            } else {
                RxJavaPlugins.onError(e);
            }
            return;
        }
        if (!d.isDisposed()) {
            observer.onComplete();
        }
    }

}


public final class CompletableFromCallable extends Completable {

    final Callable<?> callable;

    public CompletableFromCallable(Callable<?> callable) {
        this.callable = callable;
    }

    @Override
    protected void subscribeActual(CompletableObserver observer) {
        Disposable d = Disposables.empty();
        observer.onSubscribe(d);
        try {
            callable.call();
        } catch (Throwable e) {
            Exceptions.throwIfFatal(e);
            if (!d.isDisposed()) {
                observer.onError(e);
            } else {
                RxJavaPlugins.onError(e);
            }
            return;
        }
        if (!d.isDisposed()) {
            observer.onComplete();
        }
    }
}


所以代码是完全一样的。我认为它们的存在主要是为了方便 - 如果您已经拥有 Callable你想用 Completable 包裹起来,你可以直接使用它。如果您有 Action,则相同,或 Runnable ( Completable.fromRunnable 也存在)。如果只有一个存在,您必须做一些额外的工作才能将一个转换为另一个。

资料来源:
https://github.com/ReactiveX/RxJava/blob/2.x/src/main/java/io/reactivex/internal/operators/completable/CompletableFromCallable.java

https://github.com/ReactiveX/RxJava/blob/2.x/src/main/java/io/reactivex/internal/operators/completable/CompletableFromAction.java

关于rx-java - RxJava2 Completable.fromAction() 和 Completable.fromCallable() 的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62450133/

相关文章:

java - RX Java-使用 java var args 压缩 n 个 Observables

android - 如何重新加载 recyclerview?

android - 将 Firebase 任务<Void> 包装到 RxJava CompletableEmitter 中?

java - RxJava Single<> 带有计数、谓词和延迟

rx-java - RxJava:取消订阅可从另一个异步生产中观察到的异步

java - 收集数组列表中的所有可观察字符串

java - 在不创建全新列表类的情况下将 Arraylist 转换为 Observable 列表?

android - RxJava - 组合多个/不同的网络服务调用

android - 一次性、一次性观察者和复合一次性的区别

java - Rxjava 2 Maybe.toSingle 错误