Как отложить загрузку элементов с помощью RxJava? - PullRequest
0 голосов
/ 29 августа 2018

Во время надувания представления Android я загружаю кучу вещей из фонового потока и надуваю некоторые представления, основываясь на сетевых ответах. Поэтому я пытаюсь отложить некоторые из этих задач, используя RxJava, как это

Single.fromCallable(() -> savedInstanceState)
           .delay(50,TimeUnit.MICROSECONDS,AndroidSchedulers.mainThread())
            .flatMapCompletable(this::loadVideos)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new CompletableObserver() {
                @Override
                public void onSubscribe(Disposable d) {
                    Timber.d("on Subscribe");
                }

                @Override
                public void onComplete() {
                    Timber.d("on onComplete");

                }

                @Override
                public void onError(Throwable e) {
                    Timber.d("on onError");

                }
            });

И метод loadVideos выглядит так:

private Completable loadVideos(Bundle savedInstanceState) {
    return Completable.fromAction(() -> {
        videoPresenter.loadVideos(savedInstance);
    });
}

Я обнаружил, что onSubscribe (), безусловно, вызывается, но метод videoPresenter.loadVideos никогда не вызывается. Буду признателен, если кто-нибудь может указать, что я делаю неправильно.

Для моего тестирования я реализовал следующий тест, который, кажется, работает ...

public class DelayTest {
public static void main(String[] args) throws InterruptedException {

    Single.fromCallable(() -> "hello")
            .delay(50, TimeUnit.MICROSECONDS)
            .flatMapCompletable(new Function<String, CompletableSource>() {
                @Override
                public CompletableSource apply(String s) throws Exception {
                    return getFlatMapCompletable();
                }
            })
            .subscribe(new CompletableObserver() {
                @Override
                public void onSubscribe(Disposable d) {
                    System.out.println("In onSubscribe");
                }

                @Override
                public void onComplete() {
                    System.out.println("In onComplete");

                }

                @Override
                public void onError(Throwable e) {
                    System.out.println("In onError");

                }
            });
    Thread.sleep(200L);
}

private static Completable getFlatMapCompletable() {
    return Completable.fromAction(new Action() {
        @Override
        public void run() throws Exception {
            System.out.println("In flatmapCompletable");
        }
    });
}
}

1 Ответ

0 голосов
/ 30 августа 2018

Оператор задержки в RxJava выполняется в другом потоке. Таким образом, остальная часть выполнения не ждет, когда это будет закончено.

Взгляните на несколько примеров https://github.com/politrons/reactive/blob/master/src/test/java/rx/observables/utils/ObservableDelay.java

...