Heim  >  Artikel  >  Java  >  Wie verwende ich zwischengespeicherte Daten mit Retrofit und OKHttp offline?

Wie verwende ich zwischengespeicherte Daten mit Retrofit und OKHttp offline?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-04 14:20:02652Durchsuche

 How to use cached data with Retrofit and OKHttp offline?

Kann Retrofit mit OKHttp Cache-Daten verwenden, wenn offline

Bei der Verwendung von Retrofit und OKHttp zum Zwischenspeichern von HTTP-Antworten können Schwierigkeiten auftreten. Sehen wir uns dieses Problem und seine Lösung an:

Problem

Benutzer können zwischengespeicherte Antworten möglicherweise nicht offline lesen, wenn sie Retrofit mit OKHttp verwenden. Trotz der zwischengespeicherten JSON-Antwort wird eine UnknownHostException zurückgegeben.

Solution

Um dieses Problem zu beheben, muss die Serverantwort Cache-Control: public zum Aktivieren enthalten OkClient, um auf den Cache zuzugreifen.

Darüber hinaus können Sie den Anforderungsheader ändern, um Netzwerkverbindungen zu priorisieren, wenn auf sie zugegriffen werden kann, indem Sie Cache-Control hinzufügen: max-age=0.

Hier erfahren Sie, wie Sie es verwenden es explizit:

Für Retrofit 2.x:

Verwenden Sie einen Interceptor, um den Cache-Zugriff zu verwalten:

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

Konfigurieren Sie den Client:

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

Für OKHttp 2.0.x:

Aktualisieren Sie den Code, um die Änderungen in der Syntax widerzuspiegeln:

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

Andere Überlegungen :

  • Entfernen Sie den Vary-Header aus der Antwort, um sicherzustellen, dass alle HTTP-Methoden zwischengespeichert werden.
  • Wenn weiterhin Probleme auftreten, versuchen Sie, den Cache zu leeren und die Anwendung neu zu starten.

Das obige ist der detaillierte Inhalt vonWie verwende ich zwischengespeicherte Daten mit Retrofit und OKHttp offline?. 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