ки.Прежде всего, вы должны проверить заголовки, приходящие в ваш API через почтальона.Там вы увидите заголовок «Cache-Control».В этом заголовке должно быть публичное значение кэша, если вы хотите кэшировать этот API.Вот код:
В вашем классе ApiClient.class, где вы сохранили свой базовый URL, сделайте этот метод:
public static CacheControl getCacheControl(CachePolicy cachePolicy) {
switch (cachePolicy) {
case CACHE_ONLY:
return CacheControl.FORCE_CACHE;
case NETWORK_ONLY:
return CacheControl.FORCE_NETWORK;
case NETWORK_ELSE_CACHE:
return new CacheControl.Builder().maxAge(1, TimeUnit.MINUTES).maxStale(1, TimeUnit.MINUTES).build();
case FRESH_CASHE_ELSE_NETWORK:
return new CacheControl.Builder().maxAge(1, TimeUnit.MINUTES).minFresh(1, TimeUnit.MINUTES).build();
case CACHE_ELSE_NETWORK:
return new CacheControl.Builder().immutable().build();
}
return null;
}
Теперь создайте класс enum для сохраненияэти константы:
public enum CachePolicy {
CACHE_ONLY,
NETWORK_ONLY,
NETWORK_ELSE_CACHE,
FRESH_CASHE_ELSE_NETWORK,
CACHE_ELSE_NETWORK
}
Вставьте этот метод в ваш класс ApiClient с вашим базовым URL:
public static Retrofit getClientAuthenticationWithCache(Context context, CacheControl
cacheControl) {
String URL_BASE = "your base url";
long cacheSize = 10 * 1024 * 1024; //10MiB
Cache cache = new Cache(context.getCacheDir(), cacheSize);
Interceptor interceptor = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
request = request.newBuilder().cacheControl(cacheControl).build();
return chain.proceed(request);
}
};
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.cache(cache)
.addInterceptor(interceptor)
.build();
Retrofit.Builder builder = new Retrofit.Builder()
.baseUrl(URL_BASE)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create());
return builder.build();
}
Теперь используйте этот метод в упражнении / фрагменте, гдеВы получаете ответ следующим образом:
ApiClient.getClient(applicationContext, ApiClient.getCacheControl(CachePolicy.NETWORK_ELSE_CACHE)).create(ApiInterface::class.java)