• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Cachowanie danych android + retrofit + rxjava

Aruba Cloud - Virtual Private Server VPS
0 głosów
271 wizyt
pytanie zadane 5 grudnia 2018 w Android, Swift, Symbian przez Micheall Początkujący (420 p.)
edycja 6 grudnia 2018 przez Micheall

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

 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 344 wizyt
pytanie zadane 28 listopada 2018 w Java przez Micheall Początkujący (420 p.)
0 głosów
0 odpowiedzi 251 wizyt
0 głosów
1 odpowiedź 244 wizyt
pytanie zadane 17 stycznia 2019 w PHP przez niezalogowany

93,335 zapytań

142,331 odpowiedzi

322,415 komentarzy

62,670 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...