Maison  >  Article  >  Java  >  La mise à niveau avec OKHttp peut-elle utiliser les données mises en cache hors ligne ?

La mise à niveau avec OKHttp peut-elle utiliser les données mises en cache hors ligne ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-05 06:38:02699parcourir

Can Retrofit with OKHttp Utilize Cached Data When Offline?

Retrofit avec OKHttp peut-il utiliser les données mises en cache en mode hors connexion ?

En essayant de mettre en cache les réponses HTTP à l'aide de Retrofit et OKHttp, vous avez rencontré le problème d'obtenir une RetrofitError UnknownHostException en mode hors connexion. Cela indique que Retrofit ne parvient pas à récupérer les données mises en cache. Les modifications suivantes sont nécessaires pour résoudre ce problème :

Modifier pour Retrofit 2.x :

  • Implémentez un intercepteur OkHttp pour gérer la logique de mise en cache :

    <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>
  • Configurez OkHttpClient avec l'intercepteur et le 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>
  • Intégrez OkHttpClient avec Retrofit :

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

OKHttp 2.0.x :

  • Ajustez la configuration de votre client pour refléter la syntaxe mise à jour :

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

Réponse originale :

  • Assurez-vous que la réponse du serveur contient Cache-Control: public pour permettre à Retrofit de lire à partir du cache.
  • Implémentez un intercepteur de requêtes qui définit l'en-tête Cache-Control en fonction de la disponibilité du réseau :

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

En implémentant ces modifications, Retrofit utilisera correctement les données mises en cache en mode hors connexion, comme tant que la réponse du serveur inclut les en-têtes Cache-Control appropriés.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn