2017-12-01 35 views
2

내 응용 프로그램의 웹 서버에서 일부 데이터를로드하려고합니다. 그리고 수술의 비동기 성질 때문에, 완료하는데 얼마나 오래 걸릴지 미리 알 수있는 방법이 없습니다. 작업이 진행 중임을 사용자에게 알리기 위해로드 표시기를 사용합니다.RxJava 2 및 Android에서 onError()를 지연하는 방법은 무엇입니까?

fun loadData(){ 

    showLoader() // show loading indicator 

    Single.fromCallable { 

     // http request logic goes here 

    }.delay(1000, TimeUnit.MILLISECONDS) 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribeWith(object : DisposableSingleObserver<String>() { 

      override fun onSuccess(data: String) { 
       // do something 
       hideLoader() // on success, hide indicator 
      } 

      override fun onError(e: Throwable) { 
       displayErrorMessage() 
       hideLoader() // on error hide indicator 
      } 

     }) 
} 

내가 그래서이 delay() 연산자를 사용하는 1 초 이상 로딩 표시기를 보여주고 싶은,하지만 :

이이 (가)이 코 틀린와 RxJava 2를 사용 내놓았다이다 (나는 분명 희망) 작동이 성공하면 문제가 예상대로 작동하지만 오류가 발생하면 표시기가 1 초 후에 즉시 사라집니다.

그래서 1 초 후에 onError() 메서드를 실행할 수있는 방법이 있습니까? 감사합니다

+0

Observable.timer (1, TimeUnit.SECONDS) .switchMapSingle {Single.fromCallable {// ...}}'로 갈 수 없습니까? – mcassiano

+0

mcassino 완벽하게 작동합니다. 'timer()'연산자를 먼저 Observable로 변환하는 대신 Single에 직접 적용 할 수 있습니까? –

+0

당신은 할 수 :) 나는 Single.timer() 다음지도() 생각도 할 수있는 올바른 방법입니다. – mcassiano

답변

1

작업은 백그라운드에서 이루어지기 때문에 그냥 UI를 동결없이 잘 수 스레드 :

SystemClock.sleep(1000) 

그냥 nacassiano 코멘트에 hideLoader() 호출하기 전에

+0

좋은 생각인데'delay()'가해야 할 일이 아닌가? –

+0

지연 문서에서 _ ObservableSource_ 소스의 방출을 지연시키는 Observable을 반환합니다. 그래서 방출이 아니라 실행을 지연시킵니다. 이론적으로 지연 방출이 시작되기 전에 코드가 실패 할 수도 있습니다. – donfuxx

+0

donfuxx 당신은 바로 감사합니다. –

2

덕분에이를 넣어, 나는 마침내 관리 솔루션을 찾으려면

fun loadData(){ 

    showLoader() // show loading indicator 

    Single.timer(1000, TimeUnit.MILLISECONDS) 
     .flatMap{ 
      Single.fromCallable { 

       // http request logic goes here 

      } 
     }.subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribeBy(// this is an extension function from rxkotlin 
      onSuccess = { 
       // do something 
       hideLoader() // on success, hide indicator 
      }, 
      onError = { 
       displayErrorMessage() 
       hideLoader() // on error hide indicator 
      } 
     ) 
} 

이 정보가 도움이되기를 바랍니다.