Что такое idomatic способ обновления с использованием RxBinding на SwipeRefreshLayout

Я изо всех сил пытаюсь понять, как правильно использовать RxBinding , если я хочу вызвать сетевой запрос, когда пользователь SwipeRefreshLayout , я бы хотел сказать что-то вроде

  RxSwipeRefreshLayout.refreshes(swipeContainer) .flatMap { networkRequest() } .subscribeBy( onNext = { list: List<Data> -> Timber.d(data) }, onError = { showErrorSnackbar(it) }, onComplete = { Timber.d("On Complete") }) 

Но для меня это не работает, потому что у меня есть функция, называемая setupSwipeRefresh() которую я вызываю в onStart , поэтому, как только onStart вызывается, сетевой запрос выполняется, потому что именно тогда подписывается макет.

Теперь я не уверен, что делать. Я мог бы просто поместить все это в refreshListener но этот вид побеждает цель RxBinding .

Или я мог бы выполнить networkRequest в onNext из swipeContainer . Но тогда это будет выглядеть примерно так:

  RxSwipeRefreshLayout.refreshes(swipeContainer) .subscribeBy( onNext = { networkRequest() .subscribeBy( onNext = { list: List<Data> -> Timber.d(data) }) }, onError = { showErrorSnackbar(it) }, onComplete = { Timber.d("On Complete") }) 

Но вызов подписки дважды кажется просто анти-шаблоном, так что, поскольку SwipeRefreshLayout находится в библиотеке RxBinding , должен быть идиоматический способ сделать это, потому что он кажется наиболее распространенным вариантом использования.

Благодаря!

    Вы ищете что-то вроде этого:

     SwipeRefreshLayout viewById = findViewById(R.id.activity_main_swipe_refresh_layout); Observable<State> swipe = RxSwipeRefreshLayout.refreshes(viewById) .map(o -> new IsLoading()); Observable<State> stateObservable = Observable.<State>just(new IsLoading()) .mergeWith(swipe) .switchMap(state -> Observable.concat( Observable.just(new IsLoading()), Observable.<State>timer(500, TimeUnit.MILLISECONDS) .map(aLong -> new LoadingResult(Collections.emptyList()) ) ) ).distinct(); stateObservable .observeOn(AndroidSchedulers.mainThread()) .subscribe( state -> { if (state instanceof IsLoading) { Log.d("state", "isLoading"); } else if (state instanceof LoadingResult) { Log.d("state", "loadingResult"); viewById.setRefreshing(false); } }); 

    Мероприятия

     interface State { } class IsLoading implements State { } class LoadingResult implements State { private final List<String> result; public LoadingResult(List<String> result) { this.result = result; } } 

    SwitchMap похож на FlatMap, но он переключается на новые наблюдаемые и отбрасывает входящие события из наблюдаемого ранее.