将Observable映射为Completable后,RxJava2中的subscribe方法未被调用

3

我有一个点击事件需要进行网络请求。

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

点击是一个可观察对象。
networkCall 返回一个 Completable。
但是当我点击按钮时,subscribe 中的块永远不会被调用。

我也尝试过

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

我该如何使这个功能正常工作,以便每次点击按钮时都会发起一个网络请求,并在 subscribe 中处理。

编辑:

目前我还没有做网络请求,所以代码只是……

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

所以它保证会完成。


你如何覆盖subscribe函数?我不确定,但如果你只是覆盖了onNext函数,这可能不起作用。你是否也已经在你的订阅器中覆盖了onComplete函数? - Christopher
关于文档,我也会说flatMapCompletable不是适合您的正确选项:将上游Observable的每个元素映射到CompletableSources中,订阅它们并等待上游和所有CompletableSources完成。-> RxView.clicks根本不会完成! http://reactivex.io/RxJava/javadoc/io/reactivex/Observable.html#flatMapCompletable-io.reactivex.functions.Function- - Christopher
@Christopher 我有一种感觉flatmapCompletable不太合适,这就是为什么我也尝试了第二个代码块。我已经重写了onNextonComplete并在这些方法中添加了日志和断点,但它们都没有被触发。然而,即使使用第二个代码块,我仍然担心当网络调用中调用onComplete时可能会结束流。 - SunnySydeUp
我的唯一选择是将网络调用嵌套在点击事件的订阅内吗?所以基本上需要两个订阅吗? - SunnySydeUp
@SunnySydeUp,你确定你的networkCall已经完成了吗?请添加代码。 - yosriz
1个回答

10

flatMap方法需要有数据项才能触发onComplete方法,否则由于前面提到的不会完成的点击事件源,它将永远无法触发。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接