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.
Untuk Retrofit 2.x, kaedah pilihan untuk caching luar talian melibatkan penggunaan Pemintas OkHttp.
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>
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>
Tambahkan klien untuk menyesuaikan semula
<code class="java">Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .client(client) .addConverterFactory(GsonConverterFactory.create()) .build();</code>
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 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!