[英]How to chain two subscriptions with RxAndroid without flatmap?
我有一连串的事件,例如:“加载-显示-存储”。 显示和存储的地方当然会同时发生(将其存储在后台,同时向用户显示)
像这样:
myVideoService.getVideo(id)
.compose(applySchedulers())
.subscribe((video) -> {
showVideo(video);
myVideoService.storeVideo(video).subscribe();
}, Throwable::printStackTrace)
我怎么能这样写:
myVideoService.storeVideo(video).subscribe();
原始观察的一部分? 我想在后台运行此可观察到的东西,但是如果我使用flatMap,则会在显示视频之前发生,基本上会阻止它。 即使时间不多,我仍然不喜欢这个概念:
myVideoService.getVideo(id)
.compose(applySchedulers())
.flatMap((video) -> myVideoService.storeVideo(video))
.subscribe((video) -> {
showVideo(video);
}, Throwable::printStackTrace)
这将在存储完成后生成showVideo,而理想情况下应并排显示
还有其他方法可以做到在显示和存储视频时不会互相阻塞吗?
问题是您在flatMap之前应用了调度程序,因此flatMap在主线程上求值。 您必须先拆分applySchedulers
或将flatMap
移到它上面:
myVideoService.getVideo(id)
.subscribeOn(Schedulers.io()) // <----------------------------------
.flatMap((video) -> myVideoService.storeVideo(video))
.observeOn(AndroidSchedulers.mainThread()) // <----------------------------------
.subscribe((video) -> {
showVideo(video);
}, Throwable::printStackTrace);
完全并行执行save
和show
一种方法是这样的。 创建一个PublishSubject,向其中添加两个订阅,一个用于播放视频,一个用于将其保存在某个位置( myVideoService.storeVideo(video).subscribe()
)。 进行原始的myVideoService.getVideo(id)
调用并myVideoService.getVideo(id)
订阅主题。
这样,您将最终进行两个并行操作。
PublishSubject subject = PublishSubject.create();
subject
.doOnNext(video -> myVideoService.storeVideo(video))
.subscribe();
subject
.subscribe(this::showVideo);
myVideoService.getVideo(id).subscribe(subject);
考虑到这一点,如果保存操作很快,就没有理由通过@akarnokd解决方案编写所有其他代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.