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.
Für Retrofit 2.x umfasst die bevorzugte Methode für Offline-Caching die Verwendung eines OkHttp-Interceptors.
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>
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>
Client zur Nachrüstung hinzufügen
<code class="java">Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .client(client) .addConverterFactory(GsonConverterFactory.create()) .build();</code>
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>
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!