【问题标题】:How to chain two subscriptions with RxAndroid without flatmap?如何在没有平面图的情况下使用 RxAndroid 链接两个订阅?
【发布时间】:2017-01-25 12:26:18
【问题描述】:

我有一个类似的事件链:“加载一些东西 - 展示它 - 存储它”。显示和存储当然是同时发生的(在向用户显示的同时将其存储在后台)

类似这样的:

myVideoService.getVideo(id)
   .compose(applySchedulers())
   .subscribe((video) -> {
      showVideo(video);
      myVideoService.storeVideo(video).subscribe();
   }, Throwable::printStackTrace)

我怎么做这条线:

myVideoService.storeVideo(video).subscribe();

原始 observable 的一部分?我想在后台运行这个 observable 但如果我使用 flatMap 这将在显示视频之前发生,基本上阻止它。即使时间不多我仍然不喜欢这个概念:

myVideoService.getVideo(id)
   .compose(applySchedulers())
   .flatMap((video) -> myVideoService.storeVideo(video))
   .subscribe((video) -> {
      showVideo(video);
   }, Throwable::printStackTrace)

这将在存储完成后制作 showVideo,而理想情况下应该并排

在显示和存储视频不会相互阻塞的情况下,还有其他方法可以做到这一点吗?

【问题讨论】:

    标签: android rx-java observable rx-android


    【解决方案1】:

    问题是您在 flatMap 之前应用调度程序,因此 flatMap 在主线程上进行评估。你必须打破applySchedulers或在它之前移动flatMap

    myVideoService.getVideo(id)
      .subscribeOn(Schedulers.io())                   // <----------------------------------
      .flatMap((video) -> myVideoService.storeVideo(video))
      .observeOn(AndroidSchedulers.mainThread())      // <----------------------------------
      .subscribe((video) -> {
          showVideo(video);
      }, Throwable::printStackTrace);
    

    【讨论】:

      【解决方案2】:

      真正并行执行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 解决方案上编写所有额外代码。

      【讨论】:

        猜你喜欢
        • 2018-03-24
        • 2021-11-25
        • 1970-01-01
        • 2019-02-22
        • 2016-10-02
        • 2016-04-04
        • 1970-01-01
        • 1970-01-01
        • 2021-12-21
        相关资源
        最近更新 更多