Heim  >  Artikel  >  Java  >  Kann Retrofit mit OKHttp im Offline-Modus zwischengespeicherte Daten nutzen?

Kann Retrofit mit OKHttp im Offline-Modus zwischengespeicherte Daten nutzen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-05 06:38:02647Durchsuche

Can Retrofit with OKHttp Utilize Cached Data When Offline?

Kann Retrofit mit OKHttp im Offline-Modus zwischengespeicherte Daten nutzen?

Beim Versuch, HTTP-Antworten mithilfe von Retrofit und OKHttp zwischenzuspeichern, ist das Problem aufgetreten dass im Offline-Modus eine RetrofitError UnknownHostException auftritt. Dies weist darauf hin, dass Retrofit die zwischengespeicherten Daten nicht abrufen kann. Die folgenden Änderungen sind erforderlich, um dieses Problem zu beheben:

Bearbeiten für Retrofit 2.x:

  • Implementieren Sie einen OkHttp-Interceptor, um die Caching-Logik 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 OkHttpClient mit dem Interceptor und Cache:

    <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 mit Retrofit integrieren:

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

OKHttp 2.0.x:

  • Anpassen Ihr Client-Setup, um die aktualisierte 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);
          }
          ...</code>

Originalantwort:

  • Stellen Sie sicher, dass die Serverantwort Cache-Control enthält : öffentlich, um Retrofit das Lesen aus dem Cache zu ermöglichen.
  • Implementieren Sie einen Anforderungs-Interceptor, der den Cache-Control-Header festlegt basierend auf der Netzwerkverfügbarkeit:

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

Durch die Implementierung dieser Änderungen nutzt Retrofit die zwischengespeicherten Daten korrekt, wenn sie offline sind, sofern die Serverantwort die entsprechenden Cache-Control-Header enthält.

Das obige ist der detaillierte Inhalt vonKann Retrofit mit OKHttp im Offline-Modus zwischengespeicherte Daten 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