2015-11-18 2 views
0

Dans mon application Android, je cache les réponses du serveur en utilisant OkHttp. pour que j'ai mis en œuvre le code comme suitComment mettre à jour le cache OkHttp

 private class CacheInterceptor implements Interceptor { 

     Context mContext; 

     public CacheInterceptor(Context context) { 
      this.mContext = context; 
     } 

     @Override 
     public Response intercept(Chain chain) throws IOException { 
      Request request = chain.request(); 
       request = request.newBuilder() 
         .header(HEADER_MOBILE_OS, Constants.MOBILE_OS) 
         .header(HEADER_APP_VERSION, BuildConfig.VERSION_NAME) 
         .build(); 
      Response response = chain.proceed(request); 

      if (!mShouldUpdateCache) { 
       response.newBuilder() 
         .header("Cache-Control", String.format("max-age=%d", CACHE_MAX_AGE)).build(); 
      } else { 
//update cache in this case 
       response.newBuilder() 
         .header("Cache-Control", "no-cache").build(); 
       mShouldUpdateCache = false; 
      } 
      return response; 
     } 
    } 

c'est ma classe intercepteur et je suis en train de cela OkClient comme suit

okHttpClient.networkInterceptors().add(new CacheInterceptor(context)); 

    File httpCacheDirectory = new File(context.getCacheDir(), "response_cache"); 
    Cache cache = new Cache(httpCacheDirectory, CACHE_SIZE); 

    if (cache != null) { 
     okHttpClient.setCache(cache); 
    } 

mais le problème est, lorsque le mShouldUpdateCache booléenne devient vrai, je dois mettre à jour le cache. En ce moment, j'ai écrit response.newBuilder().header("Cache-Control", "no-cache").build(); mais ce n'est ni la mise à jour du cache ni la récupération du serveur, comment puis-je résoudre ce problème?

Répondre

1

Je soupçonne que votre intercepteur réseau ne s'exécute pas pour les réponses provenant du cache, car le réseau n'est pas utilisé pour ces demandes. De l'interceptors doc, les intercepteurs de réseau sont « Non invoqué pour les réponses mises en cache que court-circuiter le réseau. »

Hacking les en-têtes de réponse sur le client est un moyen fragile pour faire la mise en cache HTTP. Vous devez utiliser les en-têtes de requête appropriés et demander à votre serveur Web de définir des en-têtes de réponse appropriés.

+0

Je n'ai pas compris réellement, pouvez-vous expliquer avec un exemple? – droidev

+0

@VividVervet 1) Votre 'Interceptor' n'est probablement pas appelé car il est ajouté aux intercepteurs réseau (qui ne sont pas appelés lorsque le réseau n'est pas utilisé pour la requête). 2) Vous ne devriez vraiment pas jouer avec la mise en cache HTTP au niveau de la couche application. Fixez votre serveur web. –

+0

@NightlyNexus intercepteur appelle et la mise en cache fonctionne parfaitement, mais je ne peux pas mettre à jour le cache manuellement – droidev