2016-12-03 6 views
1

RxJavatakeUntil演算子を使用して最適化されたキャッシュとネットワークメソッドを実装しようとしています。私はGsonモデルを使用して、APIからのJSON応答を解析しています。takeUntilは、Retrofit、RxJava、Gsonで最適化されたキャッシュとネットワークメソッド

Gsonモデルを使用しているため、サーバーからデータを取得できません。戻り値の型はNetwrok RequestとDisk cacheの両方で一致しません。

私はいくつかの方法を試してきましたが、それを正しく行うには成功しませんでした。

ApiService.java

@GET(ApiConstants.GET_QUESTIONS_URL) Observable<RequestResponse> getQuestions(); 

ineteractor.java

public void performGetElQuestions(String query, QuestionsRequestServerCallback callback) { 

getFreshNetworkData()// 
     .publish(network ->// 
      Observable.merge(network,// 
       getCachedDiskData().takeUntil(network))) 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(new DisposableObserver<Question>() { 
      @Override 
      public void onComplete() { 
      callback.onQuestionsReady(mQuestionsList); 
      } 
      @Override 
      public void onError(Throwable e) { 
      callback.onQuestionsFailed(); 
      } 

      @Override 
      public void onNext(Question question) { 
      // mQuestionsList is an arraylist 
      mQuestionsList.add(question); 
      } 
     }); 

interactor.java

private Observable<Question> getFreshNetworkData() { 
     return apiService.getQuestions() 
       .flatMap(Observable::fromIterable) 
       .doOnSubscribe((data) -> new Handler(Looper.getMainLooper())// 
        .post(() -> adapterSubscriptionInfo.add("(network) subscribed")))// 
       .doOnComplete(() -> new Handler(Looper.getMainLooper())// 
        .post(() -> adapterSubscriptionInfo.add("(network) completed"))); 
    } 

キャッシュデータ

 private Observable<Question> getCachedDiskData() { 
    List<Question> list = new ArrayList<>(); 
    //get cached data from SQLite or disk 

    return Observable.fromIterable(list)// 
     .doOnSubscribe((data) -> new Handler(Looper.getMainLooper())// 
      .post(() -> Timber.d("(disk) cache subscribed")))// 
     .doOnComplete(() -> new Handler(Looper.getMainLooper())// 
      .post(() -> Timber.d("(disk) cache completed"))); 
    } 

Gsonモデルパーサ

RequestResponse.java

Public class RequestResponse { 

    @SerializedName("questions") 
    ArrayList<Question> questions; 

    public ArrayList<Question> getQuestions() { 
     return questions; 
    } 
} 

感謝:)。

+0

サーバーから取得しているjsonとは何ですか? – iagreen

+0

Hey @iagreen、https://gist.github.com/alouanemed/65fb8069d15edfe1cc49dbe0973111f2 –

+0

エラースタックトレースを表示してください –

答えて

0

私はデータを取得してキャッシュするたびにRXJava concat + take(1)の領域を使用して利点を使用しますが、innet接続が遅い場合、キャッシュされたデータは常に準備ができています。 国のエンティティのコード例:

public Observable<ArrayList<Pair<Country,City>>> queryAllAndCopyOrLoad(){ 
    return Observable.concat(

     Observable.just(storageInteractor.queryAllAndCopySync(Country.class)) 
      .filter(RxPretty::notEmpty) 
      .subscribeOn(AndroidSchedulers.mainThread()), 

     networkService.serverApi() 
      .getCountries() 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .doOnNext(countries -> storageInteractor.deleteAllAndPut(countries, Country.class)) 
      .doOnNext(countries -> firstTime = false)) 

     .take(1) 
     .flatMap(this::transformToCityCountryPair); 
    } 
関連する問題