2017-08-24 3 views
0

私はネットワークリクエストを必要とするクリックイベントがあります。observableからcompletableにマッピングするときにRxJava2 subscribeが呼び出されない

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

クリックは観測可能です。
networkCallはCompletableを返します。
ボタンをタップするとsubscribeのブロックが呼び出されることはありません。

私は、ボタンをタップするたびに、ネットワーク要求が行われた後、subscribeで扱われているように、私は仕事にこれを取得するにはどうすればよい

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

をも試みました。

EDIT:

私はまだネットワークのものを行っていないので、現在、それはとても完了することを保証ちょうど

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'が適切ではないという気持ちがありました。それが私です2番目のコードブロックも試しました。私は 'onNext'と' onComplete'をオーバーライドし、それらのメソッドにログとブレークポイントを追加しただけで、どちらもヒットしません。しかし、2番目のコードブロックであっても、ネットワークコールから '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() }) 
関連する問題