我有一连串的事件有点像:“加载一些东西 - 显示它 - 存储它”。显示和存储当然是同时发生的(存储在后台同时显示给用户)
像这样:
myVideoService.getVideo(id)
.compose(applySchedulers())
.subscribe((video) -> {
showVideo(video);
myVideoService.storeVideo(video).subscribe();
}, Throwable::printStackTrace)
我如何制作这条线:
myVideoService.storeVideo(video).subscribe();
原始可观察对象的一部分?我想在后台运行这个 observable 但如果我使用 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);
关于android - 如何在没有平面图的情况下使用 RxAndroid 链接两个订阅?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41851638/