繁体   English   中英

如何在不带平面图的情况下使用RxAndroid链接两个订阅?

[英]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);

完全并行执行saveshow一种方法是这样的。 创建一个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM