Okhttp是由Sqare公司開發的開源網絡訪問庫,目前在Android和Java開發中有着普遍的應用。在Android開發中和Retrofit結合能夠很是方便地調用網絡接口。git
使用緩存可讓咱們的app不用長時間地顯示使人厭煩的加載圈,提升了用戶體驗,並且還節省了流量,在數據更新不是很頻繁的地方使用緩存就很是有必要了。想要加入緩存不須要咱們本身來實現,Okhttp已經內置了緩存,默認是不使用的,若是想使用緩存咱們須要手動設置。github
若是服務器支持緩存,請求返回的Response會帶有這樣的Header:Cache-Control, max-age=xxx,這種狀況下咱們只須要手動給okhttp設置緩存就可讓okhttp自動幫你緩存了。這裏的max-age的值表明了緩存在你本地存放的時間,能夠根據實際須要來設置其大小。緩存
首先咱們要提供了一個文件路徑用來存放緩存,出於安全性的考慮,在Android中咱們推薦使用Context.getCacheDir()來做爲緩存的存放路徑,另外還須要指定緩存的大小就能夠建立一個緩存了。以下所示:安全
1 2 3 |
public Cache provideCache() { return new Cache(mContext.getCacheDir(), 10240*1024); } |
建立了這個緩存後咱們還須要將其設置到okttpClient對象裏面:服務器
1 2 3 4 5 6 |
OkHttpClient okHttpClient = new OkHttpClient(); OkHttpClient newClient = okHttpClient.newBuilder() .cache(cache) .connectTimeout(20, TimeUnit.SECONDS) .readTimeout(20, TimeUnit.SECONDS) .build(); |
若是服務器不支持緩存就可能沒有指定這個頭部,或者指定的值是如no-store等,可是咱們還想在本地使用緩存的話要怎麼辦呢?這種狀況下咱們就須要使用Interceptor來重寫Respose的頭部信息,從而讓okhttp支持緩存。
以下所示,咱們重寫的Response的Cache-Control字段網絡
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class CacheInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); Response response = chain.proceed(request); Response response1 = response.newBuilder() .removeHeader("Pragma") .removeHeader("Cache-Control") //cache for 30 days .header("Cache-Control", "max-age=" + 3600 * 24 * 30) .build(); return response1; } } |
而後將該Intercepter做爲一個NetworkInterceptor加入到okhttpClient中:app
1 2 3 4 5 6 7 8 |
OkHttpClient okHttpClient = new OkHttpClient(); OkHttpClient newClient = okHttpClient.newBuilder() .addNetworkInterceptor(new CacheInterceptor()) .cache(cache) .connectTimeout(20, TimeUnit.SECONDS) .readTimeout(20, TimeUnit.SECONDS) .build(); |
這樣咱們就能夠在服務器不支持緩存的狀況下使用緩存了。
完整代碼見githubide