RxJava2 Completable.fromAction() 与 Completable.fromCallable() 的区别是什么?

8

我们何时应该使用Completable.fromAction(),何时应该使用Completable.fromCallable()?有特定的用例吗?

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

Completable.FromAction enter image description here

Completable.fromCallable enter image description here

2个回答

7

实际上没有什么区别。以下是代码:

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中,可以直接使用它。如果你有一个ActionRunnable,也是一样(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

4

对我来说,唯一的区别是当你深入研究Action0与Callable的实际差异时,这两者的工作方式不同:

public interface Action0 extends Action {
    void call();
}

vs

public interface Callable<V> {
    /**
     * Computes a result, or throws an exception if unable to do so.
     *
     * @return computed result
     * @throws Exception if unable to compute a result
     */
    V call() throws Exception;
}

基本上,如果你的逻辑返回了空值(这正是Callable的情况),你最好选择Completable.fromAction来使代码更加简洁。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接