Okhttp cache-在Okhttp中使用緩存

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

相關文章
相關標籤/搜索