ホームページ  >  記事  >  Java  >  OKHttp を使用してレトロフィットすると、キャッシュされたデータをオフラインで使用できますか?

OKHttp を使用してレトロフィットすると、キャッシュされたデータをオフラインで使用できますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-04 20:01:02709ブラウズ

Can Retrofit with OKHttp Use Cached Data Offline?

OKHttp を使用したレトロフィットはオフライン時にキャッシュ データを使用できますか?

この質問では、HTTP 応答をキャッシュするための Retrofit と OKHttp の使用について説明します。オフラインアクセス用。質問で提供されているコードは一般的なアプローチに従っていますが、キャッシュされた応答をオフラインで取得できないため、追加の構成が必要であることがわかります。

Retrofit 2.x 用に編集

Retrofit 2.x の場合、オフライン キャッシュに推奨される方法には、OkHttp インターセプターの使用が含まれます。

  1. インターセプターを作成します:

    <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. クライアントのセットアップ:

    <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. クライアントをレトロフィットに追加

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

OKHttp 2.0.x (元の回答)

OKHttp 2.0.x では、setResponseCache メソッドは 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>

元の回答

元の回答では、OkClient がキャッシュされたデータにオフラインでアクセスするには、サーバー応答に Cache-Control: public ヘッダーが必要であると強調しています。

さらに、パラメーター化されたヘッダー構成は、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>
を使用して実現できます。

以上がOKHttp を使用してレトロフィットすると、キャッシュされたデータをオフラインで使用できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。