1
RxJava
のtakeUntil
演算子を使用して最適化されたキャッシュとネットワークメソッドを実装しようとしています。私は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;
}
}
感謝:)。
サーバーから取得しているjsonとは何ですか? – iagreen
Hey @iagreen、https://gist.github.com/alouanemed/65fb8069d15edfe1cc49dbe0973111f2 –
エラースタックトレースを表示してください –