> Java > java지도 시간 > OKHttp로 개조하여 오프라인일 때 캐시된 데이터를 활용할 수 있습니까?

OKHttp로 개조하여 오프라인일 때 캐시된 데이터를 활용할 수 있습니까?

Mary-Kate Olsen
풀어 주다: 2024-11-05 06:38:02
원래의
708명이 탐색했습니다.

Can Retrofit with OKHttp Utilize Cached Data When Offline?

OKHttp로 Retrofit하여 오프라인일 때 캐시된 데이터를 활용할 수 있습니까?

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>
    로그인 후 복사

원래 답변:

  • Retrofit이 캐시에서 읽을 수 있도록 하려면 서버 응답에 Cache-Control: public이 포함되어 있는지 확인하세요.
  • 네트워크 가용성에 따라 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿