如何使用RxJava延迟加载项目?

时间:2018-08-29 16:53:43

标签: android rx-java2

在扩大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 :(得分:0)

RxJava中的

Delay 运算符在另一个线程中执行。因此,执行的其余部分不会等待这一操作完成。

看看一些示例https://github.com/politrons/reactive/blob/master/src/test/java/rx/observables/utils/ObservableDelay.java