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

Bolehkah Retrofit dengan OKHttp Menggunakan Data Cache di Luar Talian?

Patricia Arquette
Patricia Arquetteasal
2024-11-04 20:01:02711semak imbas

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

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

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>

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>

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!

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