Rumah >Java >javaTutorial >Bagaimana untuk menggunakan data cache dengan Retrofit dan OKHttp luar talian?

Bagaimana untuk menggunakan data cache dengan Retrofit dan OKHttp luar talian?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-04 14:20:02750semak imbas

 How to use cached data with Retrofit and OKHttp offline?

Boleh Retrofit dengan OKHttp menggunakan data cache semasa luar talian

Apabila menggunakan Retrofit dan OKHttp untuk cache respons HTTP, kesukaran mungkin timbul. Mari kita periksa masalah ini dan penyelesaiannya:

Masalah

Pengguna mungkin gagal membaca respons cache di luar talian apabila menggunakan Retrofit dengan OKHttp. Walaupun mempunyai respons JSON cache, UnknownHostException dikembalikan.

Solution

Untuk menyelesaikan isu ini, respons pelayan mesti mengandungi Cache-Control: public untuk mendayakan OkClient untuk mengakses cache.

Selain itu, anda boleh mengubah suai pengepala permintaan untuk mengutamakan sambungan rangkaian apabila ia boleh diakses dengan menambah Cache-Control: max-age=0.

Begini cara untuk menggunakan ia secara eksplisit:

Untuk Retrofit 2.x:

Gunakan Pemintas untuk mengurus akses cache:

<code class="java">private static final Interceptor REWRITE_CACHE_CONTROL_INTERCEPTOR = new Interceptor() {
    @Override public Response intercept(Chain chain) throws IOException {
        Response originalResponse = chain.proceed(chain.request());
        if (Utils.isNetworkAvailable(context)) {
            int maxAge = 60; // read from cache for 1 minute
            return originalResponse.newBuilder()
                    .header("Cache-Control", "public, max-age=" + maxAge)
                    .build();
        } else {
            int maxStale = 60 * 60 * 24 * 28; // tolerate 4-weeks stale
            return originalResponse.newBuilder()
                    .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
                    .build();
        }
    }
};</code>

Konfigurasikan klien:

<code class="java">OkHttpClient client = new OkHttpClient();
client.networkInterceptors().add(REWRITE_CACHE_CONTROL_INTERCEPTOR);

// Setup cache
File httpCacheDirectory = new File(context.getCacheDir(), "responses");
int cacheSize = 10 * 1024 * 1024; // 10 MiB
Cache cache = new Cache(httpCacheDirectory, cacheSize);

// Add cache to the client
client.setCache(cache);
// ...</code>

Untuk OKHttp 2.0.x:

Kemas kini kod untuk menggambarkan perubahan dalam sintaks:

<code class="java">        File httpCacheDirectory = new File(context.getCacheDir(), "responses");

        Cache cache = null;
        try {
            cache = new Cache(httpCacheDirectory, 10 * 1024 * 1024);
        } catch (IOException e) {
            Log.e("OKHttp", "Could not create http cache", e);
        }

        OkHttpClient okHttpClient = new OkHttpClient();
        if (cache != null) {
            okHttpClient.setCache(cache);
        }
        String hostURL = context.getString(R.string.host_url);

        api = new RestAdapter.Builder()
                .setEndpoint(hostURL)
                // ...
                .build()
                .create(MyApi.class);</code>

Pertimbangan Lain :

  • Alih keluar pengepala Vary daripada respons untuk memastikan semua kaedah HTTP dicache.
  • Jika anda masih menghadapi masalah, cuba kosongkan cache dan mulakan semula aplikasi.

Atas ialah kandungan terperinci Bagaimana untuk menggunakan data cache dengan Retrofit dan OKHttp luar talian?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn