ホームページ > Java > &#&チュートリアル > OKHttp を使用して改造すると、オフライン時にキャッシュされたデータを利用できますか?

OKHttp を使用して改造すると、オフライン時にキャッシュされたデータを利用できますか?

Mary-Kate Olsen
リリース: 2024-11-05 06:38:02
オリジナル
731 人が閲覧しました

Can Retrofit with OKHttp Utilize Cached Data When Offline?

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

Retrofit と OKHttp を使用して HTTP 応答をキャッシュしようとすると、問題が発生しましたオフライン時に RetrofitError UnknownHostException が発生する問題について説明します。これは、Retrofit がキャッシュされたデータを取得できないことを示します。この問題を解決するには、次の変更が必要です:

Retrofit 2.x 用に編集:

  • キャッシュ ロジックを管理するために OkHttp インターセプターを実装します。

    <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>
    ログイン後にコピー
  • インターセプターとキャッシュを使用して OkHttpClient を構成します:

    <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>
    ログイン後にコピー
  • OkHttpClient を Retrofit と統合します:

    <code class="java">Retrofit retrofit = new Retrofit.Builder()
          .baseUrl(BASE_URL)
          .client(client)
          .addConverterFactory(GsonConverterFactory.create())
          .build();</code>
    ログイン後にコピー

OKHttp 2.0.x:

  • 更新された構文を反映するようにクライアント設定を調整します:

    <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>
    ログイン後にコピー

元の回答:

  • サーバー応答に Cache-Control: public が含まれていることを確認し、Retrofit がキャッシュから読み取ることができるようにします。
  • ネットワークの可用性に基づいて Cache-Control ヘッダーを設定するリクエスト インターセプターを実装します:

    <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>
    ログイン後にコピー

これらの変更を実装することで、Retrofit はオフライン時にキャッシュ データを正しく利用します。サーバー応答に適切な Cache-Control ヘッダーが含まれている限り。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート