OkHttp 3 caché de respuestas (java.net.UnknownHostException)

Estoy realmente atrapado en este problema.

Quiero almacenar en caché la respuesta del servidor durante algún tiempo para usar los datos cuando el dispositivo está fuera de línea. Así que configuré un caché para miOkHttpClient. También puseCache-Contlol encabezamiento.

Aquí está mi código:

    public class MainActivity extends AppCompatActivity {

    Retrofit retrofit;
    RecyclerView recyclerView;
    RandomUserAdapter mAdapter;
    Cache cache;
    Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initViews();

        GsonBuilder gsonBuilder = new GsonBuilder();
        Gson gson = gsonBuilder.create();

        cache = provideOkHttpCache();

        Timber.plant(new Timber.DebugTree());

        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                populateUsers();
            }
        });

        Interceptor cacheInterceptor = new Interceptor() {
            @Override
            public okhttp3.Response intercept(Interceptor.Chain chain) throws IOException {
                okhttp3.Response originalResponse = chain.proceed(chain.request());
                okhttp3.Response modifyedResponse = originalResponse;

                if (true) {
                    modifyedResponse = originalResponse.newBuilder()
                            .header("Cache-Control", "max-age=86400")
                            .build();
                }

                return modifyedResponse;
            }
        };

        HttpLoggingInterceptor httpLoggingInterceptor = new
                HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
            @Override
            public void log(@NonNull String message) {
                Timber.i(message);
            }
        });

        httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

        OkHttpClient okHttpClient = new OkHttpClient()
                .newBuilder()
                .addInterceptor(httpLoggingInterceptor)
                .addInterceptor(cacheInterceptor)
                .cache(cache)
                .build();

        retrofit = new Retrofit.Builder()
                .client(okHttpClient)
                .baseUrl("https://randomuser.me/")
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();

        populateUsers();

    }

    private void initViews() {
        recyclerView = findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        button = findViewById(R.id.button);
    }

    private void populateUsers() {
        Call<RandomUsers> randomUsersCall = getRandomUserService().getRandomUsers(10);
        randomUsersCall.enqueue(new Callback<RandomUsers>() {
            @Override
            public void onResponse(Call<RandomUsers> call, @NonNull Response<RandomUsers> response) {
                if (response.isSuccessful()) {
                    Log.v("cache-control", "using cache = " + isFromCache(response));
                    mAdapter = new RandomUserAdapter();
                    mAdapter.setItems(response.body().getResults());
                    recyclerView.setAdapter(mAdapter);
                }
            }

            @Override
            public void onFailure(Call<RandomUsers> call, Throwable t) {
                Timber.i(t.getMessage());
                Log.v("cache-control", "response failure");
            }
        });
    }

    public RandomUsersApi getRandomUserService() {
        return retrofit.create(RandomUsersApi.class);
    }

    Cache provideOkHttpCache() {
        int cacheSize = 10 * 1024 * 1024; // 100 MiB
        File cacheDir = new File("cachedirectory");
        Cache cache = new Cache(cacheDir, cacheSize);
        return cache;
    }

    public boolean isFromCache(Response response) {
        return response.raw().cacheResponse() != null;
    }
}

Parece que todo va a estar bien. Entonces hago esto:

ejecutar la aplicaciónmire los registros de OkHttp y en la pantalla para asegurarse de que hemos recibido los datos correctamentecerrar appactivar el modo de vuelo en el dispositivo (todas las redes apagadas)ejecutar la aplicación

En este momento, espero que la aplicación use datos en caché. Pero no lo hace. Solo tengo pantalla en blanco yHTTP FAILED: java.net.UnknownHostException: Unable to resolve host "randomuser.me": No address associated with hostname en mi logcat

Respuestas a la pregunta(1)

Su respuesta a la pregunta