2017-09-01 30 views
0

オフラインで見るためにデータにアクセスできるようにするには、まずデータベースからデータを要求し、次にネットワークからapiデータベースへ)。 F.e.私は、ユーザIDによるリサイクルのスコアを取得したいと言う:RxJava 2デバウンス:次の観測可能なエラーが発生したときにデバウンスを無視する方法

Datalayer:

class RecycleScoreRepository{ 

fun getRecycleScoresByUserId(userId: Int): Observable<RecycleScores> { 
    return Observable.concatArray(
      getRecycleScoresFromDb(userId), 
      getRecycleScoresFromApi(userId))} 
} 


object RepositoryManager { 

... 

fun getRecycleScoresByUserId(userId: Int): Observable<RecycleScores> { 

    return recycleScoreRepository.getRecycleScoresByUserId(userId) 
      //Drop DB data if we can fetch item fast enough from the API to avoid UI flickers 
      .debounce(400, TimeUnit.MILLISECONDS)} ... 

プレゼンター:

RepositoryManager.getRecycleScoresByUserId(userId) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe({ 
       // do something on success 
      }, { 
       // do something on error 
      }) 

だから私のプレゼンターがgetRecycleScoresByUserIdにリポジトリに加入しています。私はデバウンス演算子を使用している場合は、APIの呼び出しが十分に速い私はUIのちらつ​​きを防ぐためにuiの戻り値を2回設定していないことを確認しています。しかし今、何が起こるのはデータベースが正常に私にリサイクルスコアを返すが、何らかの理由でapiリクエストレスポンスにエラーが表示され、プレゼンターのサブスクライバがデータベースからの値でオブザーバブルを受け取るだけでエラーを受け取るということです。

データベースの観測値がサブスクライバによって受信され、api呼び出しがエラーを返すときにデバッガされないようにするにはどうすればよいですか?

答えて

1

これが最善の解決策ではないかもしれないが、あなたはこの部分にあなたのAPI観察可能な応答から

fun getRecycleScoresByUserId(userId: Int): Observable<RecycleScores> { 
    return Observable.concatArray(
      getRecycleScoresFromDb(userId), 
      getRecycleScoresFromApi(userId)     
       .materialize() 
       .filter{ !it.isOnError } 
       .dematerialize<RecycleScores>() 

)} 
} 

をエラーをフィルタリングすることができ、あなたの加入者は、結果を取得し続けます。あなたの2番目の質問が誤りを得るときにデバウンスしないように、私はそれを達成する方法を知らない。

編集: APIレスポンスのエラーを処理するには、apiレスポンスを別のタイプにラップし、適切に処理できるようにします。たとえば:

sealed class RecycleResponse { 
    class OK(val score: RecycleScore) : RecycleResponse() 
    class NotOK(val error: Exception) : RecycleResponse() 
} 

あなたはこれらのようにそれを使用することができます。すでに役立ちます

fun getRecycleScoresByUserId(userId: Int): Observable<RecycleResponse> { 
    return Observable.concatArray(
      getRecycleScoresFromDb(userId), 
      getRecycleScoresFromApi(userId)) 
      .map<RecycleResponse> { RecycleResponse.OK(it) } 
      .onErrorReturn { RecycleResponse.NotOK(it) } 
} 
+0

おかげで、。唯一のことは、エラー/非200のサーバー応答を処理する方法を理解する必要があることです。それについてのヒント? :) –

+1

私が持っている1つのアイデアは、あなたがそれを処理することができます成功とエラー応答を表すためにあなたの応答を他のタイプにラップすることです。私は私の答えに例を追加しました。それがあなたを助けることを願っています。 – chandra

関連する問題