【问题标题】:RxJava2 subscribe is not called when mapping observable to completable将可观察对象映射到可完成对象时,不调用 RxJava2 订阅
【发布时间】:2017-08-24 10:00:28
【问题描述】:

我有一个点击事件需要发出网络请求。

RxView.clicks(button)
    .flatMapCompletable({ x -> networkCall() })
    .subscribe(...)

点击是一个 Observable。
networkCall 返回一个 Completable。
然而,当我点击按钮时,subscribe 内的块永远不会被调用。

我也试过了

RxView.clicks(button)
    .flatMap({ x -> networkCall().toObservable<Void>() })
    .subscribe(...)

我怎样才能让它工作,以便每次点击按钮时都会发出网络请求,然后在subscribe 中处理。

编辑:

我还没有做网络的东西所以目前只是

public Completable networkCall() {
    Completable.complete();
}

所以保证完成。

【问题讨论】:

  • 如何覆盖订阅?我不确定,但如果你只是覆盖onNext 这可能不起作用。您是否还使用订阅者覆盖了onComplete 函数?
  • 关于文档,我还要说 flatmapCompletable 对您来说不是正确的选择:将上游 Observable 的每个元素映射到 CompletableSources,订阅它们并等待上游和所有 CompletableSources 完成。 -> RxView.clicks 根本没有完成! reactivex.io/RxJava/javadoc/io/reactivex/…
  • @Christopher 我觉得flatmapCompletable 不合适,这就是为什么我也尝试了第二个代码块。我已经覆盖了onNextonComplete,只是在这些方法中添加了日志和断点,但它也没有命中。但是,即使使用第二个代码块,我仍然担心,因为当从网络调用中调用 onComplete 时,它可能会结束流。
  • 我唯一的选择是将网络调用嵌套在点击的订阅中吗?所以基本上有两个订阅?
  • @SunnySydeUp,你确定你的 networkCall 完成了吗?请添加代码

标签: android rx-java2 rx-binding


【解决方案1】:

flatMap 案例需要项目,否则它的 onComplete 将永远不会触发,因为已经提到了永不完成的点击源。例如:

RxView.clicks(button)
.flatMap({ x -> networkCall().andThen(Observable.just("irrelevant")) })
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe({ v -> System.out.println(v)}, { e -> e.printStackTrace() })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多