1

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

Gson モデルを使用しているため、サーバーからデータを取得する際に行き詰まります。返されたタイプは、Netwrok リクエストとディスク キャッシュの両方で一致しないためです。

いくつかの方法をテストしてきましたが、うまくいきませんでした。

ApiService.java

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

inetactor.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);
          }
        });

インタラクター.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;
    }
}

ありがとう :) 。

4

1 に答える 1