Android RxJava 2: В чем разница между Callable и Just? - PullRequest
0 голосов
/ 25 сентября 2018

Я экспериментировал с RxJava в Android, но я пытаюсь выяснить разницу между Callable и Just.Оба получают данные только один раз, в отличие от Create, который может получать данные несколько раз.Вот код, который я использую для эксперимента:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listenCallable();
        listenJust();
    }
    private void listenCallable() {
        CompositeDisposable compositeDisposable = new CompositeDisposable();
        Disposable disposable = Shooter.getCallable().subscribe(i -> {
            Log.d("Tag", "Listen Callable: " + i);
        });
        compositeDisposable.add(disposable);
        compositeDisposable.dispose();
    }

    private void listenJust() {
        CompositeDisposable compositeDisposable = new CompositeDisposable();
        Disposable disposable = Shooter.getJust("Jay").subscribe(i -> {
            Log.d("Tag", "Listen Just " + i);
        });
        compositeDisposable.add(disposable);
        compositeDisposable.dispose();
    }
}

и класс, передающий данные:

public class Shooter {
    public static Observable<String> getCallable() {
        return Observable.fromCallable(new Callable<String>() {
            @Override
            public String call() throws Exception {
                try {
                    Thread.sleep(500);
                } catch (Exception e) {}
                return "Callable Results";
            }
        });
    }

    public static Observable<String> getJust(String input) {
        try {
            Thread.sleep(500);
        } catch (Exception e) {}
        return Observable.just("Just Results " + input);
    }
}

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Как дополнение к @EpicPandaForce:

Observable # просто нетерпелив, Observable # fromCallable ленив.

Пример eager: Observable.just (methodCall ()) -> first methodCall будетоценивать во время сборки.methodCall () - Значение будет захвачено и использовано как входной параметр для Observable # just.Это значение будет сохранено в наблюдаемой.Все к этому моменту уже произошло без какой-либо подписки.При подписке на созданный Observable захваченное значение будет воспроизводиться для каждой подписки.

Пример lazy: Observable.fromCallable (() -> methodCall ()) -> во время сборки наблюдаемое будет создано со ссылкойв лямбду.methodCall () не будет вызываться во время сборки.Лямбда-исполнение будет выполняться при каждой подписке.

Если вы хотите отложить дорогостоящую работу до первой подписки, вы должны использовать Observable # defer / Observable # fromCallable.При работе с синхронизацией.Значения, которые уже присутствуют или очень дороги для создания, вы должны использовать Observable # just.

Также, пожалуйста, посмотрите на https://github.com/ReactiveX/RxJava#assembly-time (Время сборки / Время подписки / Время выполнения)

0 голосов
/ 25 сентября 2018

Observable.fromCallable( аналогично

Observable.defer {
    try {
        Observable.just(...)
    } catch(e: Throwable) {
        Observable.error(e)
    }
}

Следовательно, just работает синхронно, в то время как fromCallable может быть отложено до другого Scheduler с помощью subscribeOn (и выполнено «позже»).

...