Rumah > Java > javaTutorial > Bolehkah Retrofit dengan OKHttp Menggunakan Data Cache di Luar Talian?

Bolehkah Retrofit dengan OKHttp Menggunakan Data Cache di Luar Talian?

Patricia Arquette
Lepaskan: 2024-11-04 20:01:02
asal
775 orang telah melayarinya

Can Retrofit with OKHttp Use Cached Data Offline?

Bolehkah Retrofit dengan OKHttp Menggunakan Data Cache Apabila Luar Talian?

Soalan ini meneroka penggunaan Retrofit dan OKHttp untuk cache respons HTTP untuk akses luar talian. Kod yang diberikan dalam soalan mengikut pendekatan biasa, tetapi ketidakupayaan untuk mendapatkan semula jawapan cache di luar talian mencadangkan beberapa konfigurasi tambahan diperlukan.

Edit untuk Retrofit 2.x

Untuk Retrofit 2.x, kaedah pilihan untuk caching luar talian melibatkan penggunaan Pemintas OkHttp.

  1. Buat Pemintas:

    <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
  2. Sediakan 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
  3. Tambahkan klien untuk menyesuaikan semula

    <code class="java">Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .client(client)
            .addConverterFactory(GsonConverterFactory.create())
            .build();</code>
    Salin selepas log masuk

OKHttp 2.0.x (Jawapan Asal)

Dalam OKHttp 2.0.x, kaedah setResponseCache kini setCache:

<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);
}</code>
Salin selepas log masuk

Jawapan Asal

jawapan asal menekankan keperluan untuk Cache-Control: pengepala awam dalam respons pelayan untuk OkClient mengakses data cache di luar talian.

Selain itu, konfigurasi pengepala berparameter boleh dicapai menggunakan RequestInterceptor:

<code class="java">RestAdapter.Builder builder= new RestAdapter.Builder()
   .setRequestInterceptor(new RequestInterceptor() {
        @Override
        public void intercept(RequestFacade request) {
            request.addHeader("Accept", "application/json;versions=1");
            if (MyApplicationUtils.isNetworkAvailable(context)) {
                int maxAge = 60; // read from cache for 1 minute
                request.addHeader("Cache-Control", "public, max-age=" + maxAge);
            } else {
                int maxStale = 60 * 60 * 24 * 28; // tolerate 4-weeks stale
                request.addHeader("Cache-Control", 
                    "public, only-if-cached, max-stale=" + maxStale);
            }
        }
});</code>
Salin selepas log masuk

Atas ialah kandungan terperinci Bolehkah Retrofit dengan OKHttp Menggunakan Data Cache di 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