2017-09-30 17 views
-1

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의 목적을 이깁니다.

swipeContaineronNext에서 networkRequest을 실행할 수 있습니다. SwipeRefreshLayoutRxBinding 라이브러리에 있기 때문에 그러나 그것은

 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 폐기됩니다

답변

0

이 같은 뭔가를 찾고있다.