2015-11-18 94 views
0

在我的Android應用程序中,我使用OkHttp從服務器緩存響應。對於我已經實現的代碼如下如何更新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; 
     } 
    } 

這是我的攔截器類,我如下

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); 
    } 

但問題是,當布爾mShouldUpdateCache變成真的,我必須將它設置爲OkClient更新緩存。現在我寫了response.newBuilder().header("Cache-Control", "no-cache").build();,但它既沒有更新緩存也沒有從服務器獲取,我該如何解決這個問題?

回答

1

我懷疑你的網絡攔截器不會執行從緩存提供的響應,因爲網絡不用於這些請求。從interceptors doc,網絡攔截器是「不調用的緩存的響應是短路的網絡。」

黑客在客戶端的響應頭是做HTTP緩存脆弱的方式。您應該使用適當的請求標頭並讓您的Web服務器設置適當的響應標頭。

+0

我實際上並沒有明白,你能舉個例子嗎? – droidev

+0

@VividVervet 1)你的'Interceptor'可能沒有被調用,因爲它被添加到網絡攔截器(當網絡不用於請求時不會調用它)。 2)你真的不應該在應用層上擺弄HTTP緩存。修復你的網絡服務器。 –

+0

@NightlyNexus攔截器調用和緩存完美,但我無法手動更新緩存 – droidev