Bolehkah Retrofit dengan OKHttp Menggunakan Data Cache Apabila Luar Talian?
Dalam percubaan untuk cache respons HTTP menggunakan Retrofit dan OKHttp, anda menghadapi isu tersebut untuk mendapatkan RetrofitError UnknownHostException apabila di luar talian. Ini menunjukkan bahawa Retrofit tidak dapat mendapatkan semula data cache. Pengubahsuaian berikut diperlukan untuk menyelesaikan isu ini:
Edit untuk Retrofit 2.x:
Laksanakan Pemintas OkHttp untuk mengurus logik caching:
<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 OkHttpClient dengan pemintas dan cache:
<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>
Sepadukan OkHttpClient dengan Retrofit:
<code class="java">Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .client(client) .addConverterFactory(GsonConverterFactory.create()) .build();</code>
OKHttp 2.0.x:
Laraskan persediaan pelanggan anda untuk mencerminkan sintaks yang dikemas kini:
<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:
Laksanakan pemintas permintaan yang menetapkan pengepala Cache-Control berdasarkan ketersediaan rangkaian:
<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>
Dengan melaksanakan pengubahsuaian ini, Retrofit akan menggunakan data cache dengan betul semasa di luar talian, sebagai asalkan respons pelayan termasuk pengepala Kawalan Cache yang sesuai.
Atas ialah kandungan terperinci Bolehkah Retrofit dengan OKHttp Menggunakan Data Cache Apabila Luar Talian?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!