2017-12-01 31 views
2

アプリケーションのWebサーバーからデータを読み込もうとしています。また、操作の非同期性のため、完了までにどれくらい時間がかかるかを事前に知る方法はありません。操作が進行中であることをユーザーに警告するために、私はローディングインジケーターを使用しています。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秒のためのローディングインジケーターを表示したいのですが、:

これは、aがkotlinとRxJava 2を使用して思い付いたです(私はそれを明確に願っています)この問題は、操作が成功した場合には期待どおりに機能しますが、エラーの場合は1秒後にすぐに消えます。

onError()メソッドを1秒後に実行できる方法はありますか?おかげ

+0

Observable.timer(1、TimeUnit.SECONDS).switchMapSingle {Single.fromCallable {// ...}} 'と一緒に行けませんか? – mcassiano

+0

mcassinoこれは完全に動作しますありがとうございます。最初にObservableに変換するのではなく、 'timer()'演算子をSingleに直接適用することはできませんか? –

+0

できます:)私はSingle.timer()とmap()もそれを行うための有効な方法だと思います。 – 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 
      } 
     ) 
} 

私はこれが誰かを助けることを願っています。

関連する問題