简体   繁体   中英

Retrofit response Cache

There are a lot of complex answers here about Retrofit cache but none seem to help me.

How do I cache my code response coming from the Retrofit response?

My App works fine downloading the JSON below but I need to make a cache for it and I never did cache on Android.

I need to open the App offline and get the result from my Retrofit call as if I was online.

public class APIClient {

public static final String BASE_URL = "https://raw.githubusercontent.com/";
private static Retrofit retrofit = null;

public static Retrofit getClient() {
    if (retrofit==null) {
        OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
        httpClient.addInterceptor(new Interceptor() {
            @Override
            public Response intercept(Interceptor.Chain chain) throws IOException {
                Request original = chain.request();

                Request request = original.newBuilder()
                        .method(original.method(), original.body())
                        .build();
                return chain.proceed(request);
            }
        });

        OkHttpClient client = httpClient.build();
        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .client(client)
                .build();
    }
    return retrofit;
}}

The json response is VERY simple:

 { "fruits":[ { "name":"Apple", "image":"https://upload.wikimedia.org/wikipedia/commons/thumb/1/15/Red_Apple.jpg/265px-Red_Apple.jpg", "price":35 }, { "name":"Banana", "image":"https://upload.wikimedia.org/wikipedia/commons/thumb/4/44/Bananas_white_background_DS.jpg/320px-Bananas_white_background_DS.jpg", "price":12 }, { "name":"Grapes", "image":"https://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/Table_grapes_on_white.jpg/320px-Table_grapes_on_white.jpg", "price":45 }, { "name":"Pineapple", "image":"https://upload.wikimedia.org/wikipedia/commons/thumb/c/cb/Pineapple_and_cross_section.jpg/286px-Pineapple_and_cross_section.jpg", "price":200 }, { "name":"cherry", "image":"http://www.desicomments.com/wp-content/uploads/2017/05/Cherry-Image-600x570.jpg", "price":13 }, { "name":"clementine", "image":"http://www.icecreamnation.org/wp-content/uploads/2013/04/Clementine_orange.jpg", "price":12.4 }, { "name":"olive", "image":"https://www.homenaturalcures.com/wp-content/uploads/olive.jpg", "price":9.5 }, { "name":"tomato", "image":"http://cdn2.stylecraze.com/wp-content/uploads/2013/05/tomato-hair-benefits1.jpg", "price":8.75 }, { "name":"huckleberry", "image":"http://farm3.static.flickr.com/2131/2082287810_47339fc93e.jpg", "price":11.75 }, { "name":"papaya", "image":"http://media.mercola.com/assets/images/foodfacts/papaya-nutrition-facts.jpg", "price":2.75 }, { "name":"lime", "image":"https://www.florihana.com/images/stories/virtuemart/product/FLE019%20-%20LIME.jpg", "price":5.75 }, { "name":"pear", "image":"https://www.organicfacts.net/wp-content/uploads/pear.jpg", "price":4.75 } ] } 

Assuming server respects Cache-Control / If-Modified-Since headers, than all you have to do is to create a Cache object and set it to OkHttpClient . Retrofit will take care of the rest.


    int cacheSize = 10 * 1024 * 1024; // 10 MB  
    Cache cache = new Cache(getCacheDir(), cacheSize);

    OkHttpClient okHttpClient = new OkHttpClient.Builder()  
            .cache(cache)
            .build();

    Retrofit.Builder builder = new Retrofit.Builder()  
            .baseUrl("http://10.0.2.2:3000/")
            .client(okHttpClient)
            .addConverterFactory(GsonConverterFactory.create());

    Retrofit retrofit = builder.build();

Source: futurestud.io

Inorder cache our server response using retrofit 2.0 and okHttp, we all need is OkHttpClient, AddNetworkInterceptor add cache interceptor, you can not use. AddInterceptor, also need not both at the same time.

This method requires no server-side operation, no other server-side caching strategy, if the server has its own cache strategy code should be modified accordingly to adapt to the server.

You can refer this link , it helped me to solve my problem

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM