RxBinding
을 제대로 사용하는 방법을 이해하는 데 어려움을 겪고 있습니다. 사용자가 SwipeRefreshLayout
을 쓸어 버릴 때 네트워크 요청을하려면 뭔가 말하고 싶습니다. 내가 onStart
에 전화 setupSwipeRefresh()
라는 함수에 싸여 것을 가지고 있기 때문에SwipeRefreshLayout에서 RxBinding을 사용하여 깔끔하게하는 방법은 무엇입니까
RxSwipeRefreshLayout.refreshes(swipeContainer)
.flatMap { networkRequest() }
.subscribeBy(
onNext = { list: List<Data> -> Timber.d(data) },
onError = { showErrorSnackbar(it) },
onComplete = { Timber.d("On Complete") })
같은 그러나 이것은 그 때 레이아웃 때문에 onStart
네트워크 요청이 만들어 불리는 너무 빨리, 나를 위해 작동하지 않습니다 님이 구독했습니다.
이제 무엇을해야할지 확신이 없습니다. 나는 단지 refreshListener
에 모든 것을 넣을 수 있지만 그 종류는 RxBinding
의 목적을 이깁니다.
swipeContainer
의 onNext
에서 networkRequest
을 실행할 수 있습니다. SwipeRefreshLayout
가 RxBinding
라이브러리에 있기 때문에 그러나 그것은
RxSwipeRefreshLayout.refreshes(swipeContainer)
.subscribeBy(
onNext = {
networkRequest()
.subscribeBy(
onNext = { list: List<Data> ->
Timber.d(data)
})
},
onError = { showErrorSnackbar(it) },
onComplete = { Timber.d("On Complete") })
처럼 보일 것이다 그러나 가입 호출하면 두 번 그냥 안티 패턴 것 같아, 그래서 그래,이 일의 관용적 방법이있을 그것 때문에 가장 일반적인 사용 사례 인 것 같습니다.
감사합니다.
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처럼
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);
}
});
이벤트하지만 새로운 관찰로 전환하고 previouse 관찰에서 이벤트를 incomming 폐기됩니다