Проблемы с модифицированным кэшированием - PullRequest
2 голосов
/ 13 апреля 2019

У меня проблемы с кешированием с помощью 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;

Есть идеи?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...