我們在做網絡請求的時候,如果網絡請求過于頻繁而且請求的數據變動不大,或者基本沒有變動,這個時候如果沒有緩存功能,我們想一下
會浪費掉多少資源,一次請求刷新一次,去請求一次,不但會消耗用戶的流量,而且還對服務端造成不必要的網絡壓力(當然如果服務器牛逼那么無所謂(*^__^*) )
所以除了自己做緩存以外okhttp自己也有一套緩存的機制
那就是繼承Interceptor接口
我們先下okhttp中 Interceptor的介紹
/*** Observes, modifies, and potentially short-circuits requests going out and the corresponding* responses coming back in. Typically interceptors add, remove, or transform headers on the request* or response.*/
他的大概意思就是 觀察,修改,并且使相應的請求走出去,通常添加這個攔截器去添加,移除,或者轉換這個請求或者返回的的header 頭部信息。
所以這個攔截器的作用就是去修改請求或者返回的頭部信息。
那么為什么修改頭部信息的攔截器就能做到緩存呢?
我們先看一個包含首部的Http Entry
http://google.com/foo GET 2 Accept-Language: fr-CA Accept-Charset: UTF-8 HTTP/1.1 200 OK 3 Content-Type: image/png Content-Length: 100 Cache-Control: max-age=600
?
可以看到頭部信息有一個Cache-Control緩存控制
我們可以通過設置這個對Http請求進行緩存設置
下面直接看這個類吧(非自己編寫,但是忘了作者的地址)
public class CacheInterceptor implements Interceptor {private Context mContext;@Overridepublic Response intercept(Chain chain) throws IOException {Request request = chain.request();//獲取請求//這里就是說判讀我們的網絡條件,要是有網絡的話我么就直接獲取網絡上面的數據,要是沒有網絡的話我么就去緩存里面取數據if(Utils.GetConnectType(mContext) == Constant.NetworkStatus.DisConnect){request = request.newBuilder()//這么寫就是只從緩存取 .cacheControl(CacheControl.FORCE_CACHE).build();LogUtils.v("CacheInterceptor\",\"no network\"");}Response orginalResponse = chain.proceed(request);//有網絡的條件下if(Utils.GetConnectType(mContext) != Constant.NetworkStatus.DisConnect){String cacheControl = request.cacheControl().toString();return orginalResponse.newBuilder()//這里設置的為0就是說不進行緩存,我們也可以設置緩存時間.header("Cache-Control", "public, max-age=" + 0).removeHeader("Pragma").build();}else{int maxTime = 4*24*60*60;return orginalResponse.newBuilder()//這里的設置的是我們的沒有網絡的緩存時間,想設置多少就是多少。.header("Cache-Control", "public, only-if-cached, max-stale="+maxTime).removeHeader("Pragma").build();}}public CacheInterceptor(Context context){this.mContext = context;}}
類里面分別對無網絡情況,和有網絡情況進行了一個區分,無網絡情況下我們在緩存中取,有網絡條件下直接進行請求并且還可以設置緩存時間