如何使用RxAndroid链接两个订阅而不使用flatmap?

时间:2017-01-25 12:26:18

标签: android rx-java observable rx-android

我有一系列事件类似:“加载东西 - 显示它 - 存储它”。显示它并存储它当然同时发生(将它存储在后台,同时向用户显示)

这样的事情:

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,而理想情况下这应该并排

显示和存储视频的任何其他方法都不会相互阻挡?

2 个答案:

答案 0 :(得分:2)

问题是您在flatMap之前应用调度程序,因此flatMap会在主线程上进行求值。您必须在applySchedulers之前拆分flatMap或移动myVideoService.getVideo(id) .subscribeOn(Schedulers.io()) // <---------------------------------- .flatMap((video) -> myVideoService.storeVideo(video)) .observeOn(AndroidSchedulers.mainThread()) // <---------------------------------- .subscribe((video) -> { showVideo(video); }, Throwable::printStackTrace);

export const routes: Routes = [
    {
        path: 'app', component: AppComponent,
            children: [
                path: 'category/:id', component: CategoryComponent,
                children: [
                    { path: 'post/:id', component: PostComponent }
                ]
            ]
    }
];

答案 1 :(得分:0)

实现saveshow的完全并行执行的一种方法是这样的。 创建一个PublishSubject,添加两个订阅,一个用于播放视频,另一个用于保存(myVideoService.storeVideo(video).subscribe())。 接听原来的myVideoService.getVideo(id)电话并订阅主题。

这样你最终将完成两个并行操作。

PublishSubject subject = PublishSubject.create();
subject
    .doOnNext(video -> myVideoService.storeVideo(video))
    .subscribe();

subject
    .subscribe(this::showVideo);

myVideoService.getVideo(id).subscribe(subject);

考虑到这一点,如果保存操作很快,就没有理由在@akarnokd解决方案上写下所有额外的代码。