>  기사  >  Java  >  Retrofit 및 OKHttp를 통해 캐시된 데이터를 오프라인으로 사용하는 방법은 무엇입니까?

Retrofit 및 OKHttp를 통해 캐시된 데이터를 오프라인으로 사용하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-04 14:20:02654검색

 How to use cached data with Retrofit and OKHttp offline?

OKHttp로 Retrofit을 사용하여 오프라인일 때 캐시 데이터를 사용할 수 있습니다

Retrofit 및 OKHttp를 활용하여 HTTP 응답을 캐시할 때 어려움이 발생할 수 있습니다. 이 문제와 해결 방법을 살펴보겠습니다.

문제

OKHttp와 함께 Retrofit을 사용할 때 사용자가 캐시된 응답을 오프라인으로 읽지 못할 수 있습니다. 캐시된 JSON 응답이 있음에도 불구하고 UnknownHostException이 반환됩니다.

Solution

이 문제를 해결하려면 서버 응답에 Cache-Control: public을 포함해야 합니다. OkClient를 사용하여 캐시에 액세스하세요.

또한 Cache-Control: max-age=0을 추가하여 네트워크 연결에 액세스할 수 있을 때 요청 헤더를 수정하여 네트워크 연결의 우선순위를 지정할 수 있습니다.

사용 방법은 다음과 같습니다. 명시적으로:

Retrofit 2.x의 경우:

인터셉터를 사용하여 캐시 액세스 관리:

<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>

클라이언트 구성:

<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>

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);
        }
        String hostURL = context.getString(R.string.host_url);

        api = new RestAdapter.Builder()
                .setEndpoint(hostURL)
                // ...
                .build()
                .create(MyApi.class);</code>

기타 고려 사항 :

  • 모든 HTTP 메서드가 캐시되도록 응답에서 Vary 헤더를 제거하세요.
  • 계속 문제가 발생하면 캐시를 지우고 애플리케이션을 다시 시작해 보세요.

위 내용은 Retrofit 및 OKHttp를 통해 캐시된 데이터를 오프라인으로 사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.