Maison > Java > javaDidacticiel > 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
Libérer: 2024-11-05 06:38:02
original
793 Les gens l'ont consulté

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>
    Copier après la connexion
  • 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>
    Copier après la connexion
  • Intégrez OkHttpClient avec Retrofit :

    <code class="java">Retrofit retrofit = new Retrofit.Builder()
          .baseUrl(BASE_URL)
          .client(client)
          .addConverterFactory(GsonConverterFactory.create())
          .build();</code>
    Copier après la connexion

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>
    Copier après la connexion

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>
    Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal