在膨胀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");
}
});
加载视频方法如下所示:
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");
}
});
}
}
RxJava 中的Delay运算符在另一个线程中执行。因此,执行的其余部分不会等待此执行完成。
看看一些例子 https://github.com/politrons/reactive/blob/master/src/test/java/rx/observables/utils/ObservableDelay.java