Witam. Piszę apkę w Androidzie w której pobieram dane w formacie JSON z przeglądarki. Korzystam z Retrofita oraz Rxjava. Na bazie różnych poradników dodałem do tego cachowanie danych ale nie do końca rozumiem jak to działa. Byłbym dozgonnie wdzięczny gdybyście mogli rozwiać parę moich wątpliwości. Z góry dziękuję.
1. Mając taki kod aplikacja będzie korzystać z wcześniejszych cache tylko jeśli wszystkie query będą się zgadzały prawda?
//Tworze liste Observable
final List<Observable<PojoData>> requests = new ArrayList<>();
//Tworze dynamicznie zapytania Retrofit i dodaje je do listy Observable
Iterator iter = nodesId.iterator();
while (iter.hasNext()) {
int nodeNumber = (int) iter.next();
requests.add(service.getData("data", String.valueOf(nodeNumber), String.valueOf(minDay) + "," + String.valueOf(maxDay)));
}
//Funkcja zip
Observable<PojoAllSecondActivity> combined = Observable.zip(requests, new Function<Object[], PojoAllSecondActivity>() {
@Override
public PojoAllSecondActivity apply(Object[] objects) throws Exception {
ArrayList<PojoData> pojoDataArrayList = new ArrayList<>();
for (Object o : objects) {
pojoDataArrayList.add((PojoData) o);
}
return new PojoAllSecondActivity(pojoDataArrayList);
}
});
public interface MyWebService {
@GET("/~mruminski/RestController.php") // deklarujemy endpoint oraz metodę
Observable<PojoData> getData(@Query("view") String view, @Query("id") String id, @Query("startend") String startend);
}
3. Na jakiej zasadzie działają te Interceptory? W tym przypadku będzie korzystał z cache jeśli nie jest starszy niż 1 dzień a jeśli nie to pobierał z internetu?
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
File httpCacheDirectory = new File(getCacheDir(), "offlineCache");
Cache cache = new Cache(httpCacheDirectory, 10 * 1024 * 1024);
OkHttpClient httpClient = new OkHttpClient.Builder()
.cache(cache)
.addInterceptor(httpLoggingInterceptor)
.addNetworkInterceptor(provideCacheInterceptor())
.addInterceptor(provideOfflineCacheInterceptor())
.build();
// ustawiamy wybrane parametry adaptera
retrofit = new Retrofit.Builder()
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create(new Gson()))
.client(httpClient)
.baseUrl("http://pluton.kt.agh.edu.pl")
.build();
// tworzymy klienta
service = retrofit.create(MyWebService.class);
private Interceptor provideCacheInterceptor() {
return new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Response originalResponse = chain.proceed(request);
String cacheControl = originalResponse.header("Cache-Control");
if (cacheControl == null || cacheControl.contains("no-store") || cacheControl.contains("no-cache") ||
cacheControl.contains("must-revalidate") || cacheControl.contains("max-stale=0")) {
CacheControl cc = new CacheControl.Builder()
.maxStale(1, TimeUnit.DAYS)
.build();
request = request.newBuilder()
.cacheControl(cc)
.build();
return originalResponse.newBuilder()
.removeHeader("Pragma")
.header("Cache-Control", "public, max-age=" + 5000)
.build();
} else {
return originalResponse;
}
}
};
}
private Interceptor provideOfflineCacheInterceptor() {
return new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
try {
return chain.proceed(chain.request());
} catch (Exception e) {
CacheControl cacheControl = new CacheControl.Builder()
.onlyIfCached()
.maxStale(1, TimeUnit.DAYS)
.build();
Request offlineRequest = chain.request().newBuilder()
.cacheControl(cacheControl)
.build();
return chain.proceed(offlineRequest);
}
}
};
}