国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android 中okhttp自定義Interceptor(緩存攔截器)

2019-12-12 03:15:52
字體:
供稿:網(wǎng)友

Android 中okhttp自定義Interceptor(緩存攔截器)

前言:

新公司項目是沒有緩存的,我的天,坑用戶流量不是么。不知道有人就喜歡一個界面沒事點來點去的么。怎么辦?一個字“加”。

由于項目的網(wǎng)絡(luò)請求被我換成了retrofit。而retrofit的網(wǎng)絡(luò)請求默認基于okhttp

okhttp的緩存由返回的header 來決定。如果服務(wù)器支持緩存的話返回的headers里面會有這一句

”Cache-Control”,“max-age=time”

這里的time是一個單位為秒的時間長度。意思是緩存的時效,比如要設(shè)置這個API的緩存時效為一天

返回的header就應(yīng)該是

”Cache-Control”,“max-age=3600*24”

不巧。公司的服務(wù)器不支持緩存的,怎么看出來的?因為我們的返回的headers是包含這些的

但我們又想用緩存,這個時候怎么辦呢。,得益于okhttp的Interceptor機制,一切的配置都可以變得那么簡單優(yōu)雅。

我們可以在攔截器里截獲headers然后移除默認的Cache-Control

但是我們知道有些API返回的數(shù)據(jù)適合緩存,而有些是不適合的,比如資訊列表,各種更新頻率比較高的,是不可以緩存的,而像資訊詳情這種數(shù)據(jù)是可以緩存的。所以我們不能直接統(tǒng)一寫死。需要動態(tài)配置。

同樣的,我們也在header里面作文章,自定義一個header。注意這個header一定不能被其他地方使用,不然會被覆蓋值。這里我們定義的header的key名字為:Cache-Time。我們在攔截器里去取這個header。如果取得了不為空的值,說明這個請求是要支持緩存的,緩存的時間就是Cache-Time對應(yīng)的值。我們把他添加進去。

自定義緩存Interceptor

public class CacheInterceptor implements Interceptor {  @Override  public Response intercept(Chain chain) throws IOException {    Request request = chain.request();    Response response = chain.proceed(request);    String cache = request.header("Cache-Time");    if (!Util.checkNULL(cache)) {//緩存時間不為空      Response response1 = response.newBuilder()          .removeHeader("Pragma")          .removeHeader("Cache-Control")          //cache for cache seconds          .header("Cache-Control", "max-age="+cache)          .build();      return response1;    } else {      return response;    }  }}

緩存攔截器定義好了,我們還需要配置緩存的路徑。這里我們定義一個緩存的內(nèi)容提供器

public class CacheProvide {  Context mContext;  public CacheProvide(Context context) {    mContext = context;  }  public Cache provideCache() {//使用應(yīng)用緩存文件路徑,緩存大小為10MB    return new Cache(mContext.getCacheDir(), 10240 * 1024);  }}

通過上面的代碼我們可以看到我們指定了緩存的大小為10MB。這里如果緩存的數(shù)據(jù)量大于這個值,內(nèi)部會使用lur規(guī)則進行刪除。

下面我們開始配置OkHttpClient

 OkHttpClient client = new OkHttpClient.Builder()          .addNetworkInterceptor(new CacheInterceptor())//緩存攔截器          .cache(new CacheProvide(mAppliactionContext).provideCache())//緩存空間提供器          .connectTimeout(8, TimeUnit.SECONDS)          .readTimeout(5, TimeUnit.SECONDS)          .writeTimeout(5, TimeUnit.SECONDS)          .build();

好了,現(xiàn)在我們?nèi)绻睦镄枰彺鏀?shù)據(jù)的話,只要在請求里添加header(“Cache-Time”,“3600*24”)就可以把當前數(shù)據(jù)緩存一天啦

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 永春县| 铜川市| 普兰县| 尚志市| 连平县| 多伦县| 瑞安市| 麟游县| 肥东县| 芜湖市| 大厂| 阿鲁科尔沁旗| 大冶市| 乌苏市| 文化| 阳城县| 肇东市| 张家港市| 修武县| 乌兰浩特市| 迁西县| 高碑店市| 新沂市| 织金县| 朝阳市| 萨迦县| 邵东县| 望江县| 扎囊县| 台北市| 滦南县| 商水县| 遂溪县| 新源县| 广丰县| 新泰市| 进贤县| 霍城县| 青阳县| 临高县| 汝阳县|