Heim >Java >javaLernprogramm >Kann Retrofit mit OKHttp zwischengespeicherte Daten offline nutzen?

Kann Retrofit mit OKHttp zwischengespeicherte Daten offline nutzen?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-04 20:01:02749Durchsuche

Can Retrofit with OKHttp Use Cached Data Offline?

Kann Retrofit mit OKHttp Cache-Daten verwenden, wenn offline?

Diese Frage untersucht die Verwendung von Retrofit und OKHttp zum Zwischenspeichern von HTTP-Antworten für den Offline-Zugriff. Der in der Frage bereitgestellte Code folgt einem allgemeinen Ansatz, aber die Unfähigkeit, zwischengespeicherte Antworten offline abzurufen, legt nahe, dass einige zusätzliche Konfigurationen erforderlich sind.

Bearbeiten für Retrofit 2.x

Für Retrofit 2.x umfasst die bevorzugte Methode für Offline-Caching die Verwendung eines OkHttp-Interceptors.

  1. Erstellen Sie einen Interceptor:

    <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. Client einrichten:

    <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. Client zur Nachrüstung hinzufügen

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

OKHttp 2.0.x (Originalantwort)

In OKHttp 2.0.x ist die setResponseCache-Methode jetzt 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>

Original Answer

The Die ursprüngliche Antwort betont die Notwendigkeit eines öffentlichen Cache-Control:-Headers in der Serverantwort, damit OkClient offline auf zwischengespeicherte Daten zugreifen kann.

Zusätzlich kann eine parametrisierte Header-Konfiguration mithilfe eines RequestInterceptor erreicht werden:

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

Das obige ist der detaillierte Inhalt vonKann Retrofit mit OKHttp zwischengespeicherte Daten offline nutzen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn