Подписка RxJava2 не вызывается при сопоставлении наблюдаемого с завершаемым

У меня есть событие клика, которому нужно сделать сетевой запрос.

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

Так что он гарантированно завершится.


person SunnySydeUp    schedule 24.08.2017    source источник
comment
Как отменить подписку? Я не уверен, но если вы просто переопределите onNext, это может не сработать. Вы также переопределили функцию onComplete со своим подписчиком?   -  person Christopher    schedule 24.08.2017
comment
Что касается документов, я бы также сказал, что flatmapCompletable не является правильным вариантом для вас: отображает каждый элемент вышестоящего Observable в CompletableSources, подписывается на них и ждет, пока вышестоящий и все CompletableSources завершатся. -› RxView.clicks вообще не завершается! reactivex.io/RxJava/javadoc /io/реактивкс/   -  person Christopher    schedule 24.08.2017
comment
@Christopher Кристофер У меня было ощущение, что flatmapCompletable не подходит, поэтому я также попробовал второй блок кода. Я переопределил onNext и onComplete и просто добавил журналы и точки останова в эти методы, и это тоже не сработало. Однако даже со вторым блоком кода я все еще обеспокоен, поскольку он может закончить поток, когда onComplete вызывается из сетевого вызова.   -  person SunnySydeUp    schedule 24.08.2017
comment
Является ли мой единственный вариант вложить сетевой вызов в подписку на клик? То есть у вас две подписки?   -  person SunnySydeUp    schedule 24.08.2017
comment
@SunnySydeUp, вы уверены, что ваш сетевой вызов завершен? пожалуйста, добавьте код   -  person yosriz    schedule 24.08.2017


Ответы (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() })
person akarnokd    schedule 24.08.2017