2017-08-24 104 views
0

我有一个需要发出网络请求的点击事件。RxJava2订阅在映射可观察到可完成时不被调用

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(); 
} 

因此它保证完成。

+0

你如何覆盖订阅?我不确定,但如果你只是重写'onNext',这可能无法正常工作。你是否也重写了用户的'onComplete'函数? – Christopher

+0

关于文档,我还会说flatmapCompletable不适合您:将上游Observable的每个元素映射到CompletableSources,订阅它们并等待上游和所有CompletableSources完成。 - >'RxView.clicks'完全没有完成! http://reactivex.io/RxJava/javadoc/io/reactivex/Observable.html#flatMapCompletable-io.reactivex.functions.Function- – Christopher

+0

@Christopher我有一种感觉,“flatmapCompletable”不合适,这就是为什么我也尝试了第二个代码块。我已经重写了'onNext'和'onComplete',并在这些方法中添加了日志和断点,并且它也没有命中。但是,即使使用第二个代码块,我仍然担心,因为当网络调用调用onComplete时,它可能会结束流。 – SunnySydeUp

回答

2

flatMap案件需要的项目,否则其onComplete永远不会因为已经提到的从未完成的点击来源发射。例如:

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