Rumah > Java > javaTutorial > teks badan

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

Mary-Kate Olsen
Lepaskan: 2024-11-04 14:20:02
asal
705 orang telah melayarinya

 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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan