Я использую модификацию для отправки запроса в Woocommerce и получения данных с сервера, и мне нужно кэшировать данные.
Я использовал инструменты для модернизации, предоставленные библиотекой для кэширования данных.Это не сработало.Я искал в Интернете и протестировал множество решений. У меня есть успешный результат, но он все еще не работает.
Мой код:
API:
@GET(URLs.EndPoint_Products)
Call<List<Salons>> getProductsCategorized(
@Query("category") String category,
@Query("per_page") int per_page
);
ЗапросМетод:
private void okhttpReq(int categoryId) {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OAuthInterceptor oauth1Woocommerce = new OAuthInterceptor.Builder()
.consumerKey(getString(R.string.cunsomer_key))
.consumerSecret(getString(R.string.consumersecret))
.build();
OkHttpClient client = new OkHttpClient
.Builder()
.cache(new Cache(getContext().getCacheDir(), 10 * 1024 * 1024)) // 10 MB
.addInterceptor(oauth1Woocommerce)
.addInterceptor(interceptor)
.addInterceptor(new Interceptor() {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
Request request = chain.request();
if (isOnline()) {
request = request.newBuilder().header("Cache-Control", "public, max-age=" + 88888860).build();
} else {
request = request.newBuilder().header("Cache-Control", "public, only-if-cached, max-stale=" + 60 * 60 * 24 * 7).build();
}
// request = request.newBuilder().header("Cache-Control", "public, max-age=" + 60).build();
return chain.proceed(request);
}
})
.build();
Gson gson = new GsonBuilder()
.setLenient()
.create();
Retrofit mRetrofit = new Retrofit.Builder()
.baseUrl(baseURL)
.addConverterFactory(GsonConverterFactory.create(gson))
.client(client)
.build();
Api api = mRetrofit.create(Api.class);
Call callSalons = api.getProductsCategorized(String.valueOf(categoryId), 100);
callSalons.enqueue(new Callback<List<Salons>>() {
@Override
public void onResponse(Call<List<Salons>> call, Response<List<Salons>> response) {
if (response.raw().cacheResponse() != null) {
Log.e("Network", "response came from cache");
}
if (response.raw().networkResponse() != null) {
Log.e("Network", "response came from server");
}
salonList.clear();
Log.e("response1", response.headers().toString());
if (response.isSuccessful()) {
try {
assert response.body() != null;
for (int i = 0; i < response.body().size(); i++) {
Salons array = response.body().get(i);
//adding the product to product list
try {
salonList.add(new Salon(
array.getId(),
array.getName(),
descriptionCorrector(array.getShort_description()),
array.getAverage_rating(),
Double.valueOf(array.getPrice()),
array.getCategories(),
array.getAttributes(),
array.getImages()
));
} catch (Exception e) {
// Log.d("retrofit error", e.getMessage());
}
}
productAdapter();
} catch (Exception e) {
Log.d("sizeerror", e.getMessage());
}
if (progressDialog.isShowing()) {
progressDialog.dismiss();
}
if (isStart) {
isStart = false;
okhttpReq_category();
}
} else {
if (progressDialog.isShowing()) {
progressDialog.dismiss();
}
okhttpReq_category();
}
}
@Override
public void onFailure(Call<List<Salons>> call, Throwable t) {
if (progressDialog.isShowing()) {
progressDialog.dismiss();
}
}
});
}
Этот запрос выполнен успешно, но он всегда возвращает ответ от сервера, а не из кэша.
Я проверил много ответов на Stackoverflow, но ни один из них не работает для меня,единственное различие между моим делом и другими подобными проблемами заключается в следующем:
.addInterceptor(oauth1Woocommerce)
, который предназначен для аутентификации Woocommerce.
Я проверил несколько раз, но он должен быть в сети, чтобы иметь успешный запрос и всегда получать данные с сервера, а не из кэша.
Не могли бы вы мне помочь?
Заранее спасибо