Разница между RxJava2 Completable.fromAction () и Completable.fromCallable ()? - PullRequest
1 голос
/ 18 июня 2020

Когда мы должны использовать Completable.fromAction(), а когда - Completable.fromCallable() Есть ли специфика c Usecase

Из документации кажется, что оба делают одно и то же, и трудно заметить разница между ними.

Completable.FromAction enter image description here

Completable.fromCallable enter image description here

Ответы [ 2 ]

1 голос
/ 18 июня 2020

Нет никакой разницы. Вот код:

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

0 голосов
/ 18 июня 2020

Ключевое (и единственное) отличие для меня - это когда вы смотрите на фактическую разницу 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;
}

В основном, если ваш logi c ничего не возвращает (что именно так в случае Callable), вам лучше go с Completable.fromAction для более чистого кода.

...