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

Cachowanie danych android + retrofit + rxjava

Object Storage Arubacloud
0 głosów
207 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ź 218 wizyt
pytanie zadane 28 listopada 2018 w Java przez Micheall Początkujący (420 p.)
0 głosów
0 odpowiedzi 201 wizyt
0 głosów
1 odpowiedź 183 wizyt
pytanie zadane 17 stycznia 2019 w PHP przez niezalogowany

92,565 zapytań

141,416 odpowiedzi

319,596 komentarzy

61,948 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...