2016-07-12 61 views
2

我試圖通過OKhttp 緩存http響應,但無法找到一些很好的示例或文檔。如何緩存squpup.okhttp3中的響應

感謝所有幫助

+0

你想幹什麼? SharedPreferences不夠用?好。把它保存在數據庫中怎麼樣? –

+0

我正在使用確定http的庫。我想使用緩存選項來緩存http響應。所以我想知道有什麼可用的選項來做到這一點。 –

+0

你有沒有[檢查此](http://square.github.io/okhttp/3.x/okhttp/)? –

回答

2

這將緩存2分鐘

OkHttpClient provideOkHttpClient() { 
    Cache cache = new Cache(new File(context.getCacheDir(), "http-cache"), 10 * 1024 * 1024); 
    return new OkHttpClient.Builder() 
      .addNetworkInterceptor(provideCacheInterceptor()) 
      .cache(cache) 
      .build(); 
} 

Interceptor provideCacheInterceptor() { 
    return new Interceptor() { 
     @Override 
     public Response intercept (Chain chain) throws IOException { 
      Response response = chain.proceed(chain.request()); 
      CacheControl cacheControl = new CacheControl.Builder() 
        .maxAge(2, TimeUnit.MINUTES) 
        .build(); 

      return response.newBuilder() 
        .header("Cache-Control", cacheControl.toString()) 
        .build(); 
     } 
    }; 
} 
2

所有響應這裏有一個樣本CacheResponse.java

Cache cache = new Cache(cacheDirectory, cacheSize); 

client = new OkHttpClient.Builder() 
    .cache(cache) 
    .build(); 

javadoc for Cache有強迫新鮮或緩存實例響應。

+0

尤里它正在工作,但我想做運行時內存緩存而不是磁盤內存,也想知道如何進一步刪除緩存。 我在這裏使用公共http客戶端。 –

+0

Cache的設計基於一個真正的文件系統AFAIK。公共API看起來不太可能。我懷疑你需要在FileSystem中使用Cache或者在攔截器中實現你自己的緩存策略 –

3
public final class FeedInterceptor{ 
private final static String TAG = FeedInterceptor.class.getSimpleName(); 

/** 
* Validate cache, return stream. Return cache if no network. 
* @param context 
* @return 
*/ 
public static Interceptor getOnlineInterceptor(final Context context){ 
    Interceptor interceptor = new Interceptor() { 
     @Override 
     public Response intercept(Chain chain) throws IOException { 
      Response response = chain.proceed(chain.request()); 

      String headers = response.header("Cache-Control"); 
      if(NetworkUtils.isConnected(context) && 
        (headers == null || headers.contains("no-store") || headers.contains("must-revalidate") || headers.contains("no-cache") || headers.contains("max-age=0"))){ 

       LOGD(TAG, "Returning fresh response"); 
       return response.newBuilder() 
         .header("Cache-Control", "public, max-age=600") 
         .build(); 
      } else{ 
       LOGD(TAG, "Returning old response"); 
       return response; 
      } 
     } 
    }; 

    return interceptor; 
} 

/** 
* Get me cache. 
* @param context 
* @return 
*/ 
public static Interceptor getOfflineInterceptor(final Context context){ 
    Interceptor interceptor = new Interceptor() { 
     @Override 
     public Response intercept(Chain chain) throws IOException { 
      Request request = chain.request(); 
      if(!NetworkUtils.isConnected(context)){ 
       request = request.newBuilder() 
         .header("Cache-Control", "public, only-if-cached") 
         .build(); 
      } 

      return chain.proceed(request); 
     } 
    }; 

    return interceptor; 
} 

}

而客戶端:

private OkHttpClient createCacheClient(Context context){ 

    File httpCacheDirecotory = new File(context.getCacheDir(), FILE); 
    Cache cache = new Cache(httpCacheDirecotory, CACHE_SIZE); 

    return new OkHttpClient.Builder() 
      .addNetworkInterceptor(FeedInterceptor.getOnlineInterceptor(context)) 
      .addInterceptor(FeedInterceptor.getOfflineInterceptor(context)) 
      .cache(cache) 
      .build(); 
} 

Reference

+0

只是工作。應該被標記爲接受 –