Android 中okhttp自定義Interceptor(緩存攔截器)
Android 中okhttp自定義Interceptor(緩存攔截器)
前言:
新公司項目是沒有緩存的,我的天,坑用戶流量不是么。不知道有人就喜歡一個界面沒事點來點去的么。怎么辦?一個字“加”。
由于項目的網(wǎng)絡請求被我換成了retrofit。而retrofit的網(wǎng)絡請求默認基于okhttp
okhttp的緩存由返回的header 來決定。如果服務器支持緩存的話返回的headers里面會有這一句
”Cache-Control”,“max-age=time”
這里的time是一個單位為秒的時間長度。意思是緩存的時效,比如要設置這個API的緩存時效為一天
返回的header就應該是
”Cache-Control”,“max-age=3600*24”
不巧。公司的服務器不支持緩存的,怎么看出來的?因為我們的返回的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對應的值。我們把他添加進去。
自定義緩存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() {//使用應用緩存文件路徑,緩存大小為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ù)緩存一天啦
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關文章
Android canvas畫圖操作之切割畫布實現(xiàn)方法(clipRect)
這篇文章主要介紹了Android canvas畫圖操作之切割畫布實現(xiàn)方法,通過clipRect方法實現(xiàn)canvas畫布的切割操作,需要的朋友可以參考下2016-10-10Android App使用RecyclerView實現(xiàn)上拉和下拉刷新的方法
RecyclerView一經(jīng)推出便被認為是替代ListView的存在,那么ListView的上拉和下拉刷新我們同樣可以使用RecyclerView來做到,這里我們就來看一下Android App使用RecyclerView實現(xiàn)上拉和下拉刷新的方法,首先先來點RecyclerView的小介紹:2016-06-06Android開發(fā)手冊TextView屬性實現(xiàn)效果盤點
這篇文章主要為大家介紹了Android開發(fā)手冊TextView屬性實現(xiàn)的效果盤點及使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06Android開發(fā)懸浮按鈕 Floating ActionButton的實現(xiàn)方法
這篇文章主要介紹了Android開發(fā)懸浮按鈕 Floating ActionButton的實現(xiàn)方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-09-09Android系統(tǒng)進程間通信Binder機制在應用程序框架層的Java接口源代碼分析
本文主要介紹 Android系統(tǒng)進程間通信Binder機制Java 接口源碼分析,這里詳細介紹了如何實現(xiàn)Binder 機制和Java接口直接的通信,有興趣的小伙伴可以參考下2016-08-08Android仿新浪微博發(fā)送菜單界面的實現(xiàn)
這篇文章主要介紹了Android仿新浪微博發(fā)送菜單界面的實現(xiàn),幫助大家更好的理解和學習使用Android開發(fā),感興趣的朋友可以了解下2021-04-04