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

She*_*lji 4 rx-java rx-java2

什么时候用Completable.fromAction(),什么时候用Completable.fromCallable()有没有具体的用例

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

Completable.FromAction 在此处输入图片说明

Completable.fromCallable 在此处输入图片说明

dan*_*ano 6

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

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

}

Run Code Online (Sandbox Code Playgroud)
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();
        }
    }
}

Run Code Online (Sandbox Code Playgroud)

所以代码是完全一样的。我认为它们的存在主要是为了方便 - 如果您已经有 aCallable想要包装在 a 中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