У меня проблемы с кешированием с помощью Retrofit.Кажется, что когда я не в сети, он даже не смотрит на кеш.Вот пример:
Вот так я получаю мой CacheReady Retrofit
public class RetrofitCached {
private static final String BASE_URL = "http://www.omdbapi.com";
private static final String TAG=RetrofitCached.class.getSimpleName();
public static boolean isNetworkAvailable(Context context) {
ConnectivityManager cm =
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
return activeNetwork != null &&
activeNetwork.isConnectedOrConnecting();
}
public static Retrofit getCacheEnabledRetrofit(final Context context) {
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.cache(new Cache(context.getCacheDir(), 5 * 1024 * 1024))
.addInterceptor(new Interceptor() {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
Response originalResponse = chain.proceed(chain.request());
Log.d(TAG,"ORIGINAL RESPPONSE HEADERS "+originalResponse.headers().toMultimap());
Log.d(TAG,"Request is here");
if(isNetworkAvailable(context)) {
Log.d(TAG,"WE HAVE INTERNET");
Log.d(TAG,"If less then 1 minute, should read from cache");
int maxAge = 60;
return originalResponse.newBuilder()
.header("Cache-Control", "public, max-age=" + maxAge)
.build();
}
else {
Log.d(TAG,"No INTERNET");
int maxStale = 60 * 60 * 24 * 28; // tolerate 4-weeks stale
return originalResponse.newBuilder()
.header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
.build();
}
}
})
.build();
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.baseUrl(BASE_URL)
.build();
return retrofit;
}
}
После этого я звоню в API:
searchMovies("Titanic");
И я получаю результаты.После того, как я выключаю Wi-Fi / 3g, когда я делаю вызов API снова, я получаю Unable to resolve host "www.omdbapi.com" No adress assoicatied with hostname.
Кажется, что он даже не проверяет, есть ли что-то в кэше, а просто пытается сделать другой запрос, но на этот раз без интернета.У меня есть журнал, который распечатывает заголовки ответа, когда я звоню через интернет, это ответ:
ORIGINAL RESPPONSE HEADERS {access-control-allow-origin=[*], cache-control=[public, max-age=86400], cf-cache-status=[HIT], cf-ray=[4c6ec52828bb9720-FRA], connection=[keep-alive], content-type=[application/json; charset=utf-8], date=[Sat, 13 Apr 2019 16:20:55 GMT], expires=[Sun, 14 Apr 2019 16:20:55 GMT], last-modified=[Fri, 12 Apr 2019 16:04:42 GMT], server=[cloudflare], set-cookie=[__cfduid=dad69c836be19bd3f9575cc59759f95d21555172455; expires=Sun, 12-Apr-20 16:20:55 GMT; path=/; domain=.omdbapi.com; HttpOnly], transfer-encoding=[chunked], vary=[*, Accept-Encoding], x-aspnet-version=[4.0.30319], x-powered-by=[ASP.NET]}
При звонке без интернета ни один из журналов в приведенном выше коде не сработал.
В качестве примечания, вот импорт, который у меня есть в классе:
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;
import java.io.IOException;
import okhttp3.Cache;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
Есть идеи?