Android OKhttp3快取處理
阿新 • • 發佈:2019-01-11
使用方法很簡單:
1.首先進行先進行設定:
public static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("text/json; charset=utf-8");//設定MediaType
private static final OkHttpClient client;
private static final long cacheSize = 1024*1024*20;//快取檔案最大限制大小20M
private static String cachedirectory = FilePathroot + "/caches" ; //設定快取檔案路徑
private static Cache cache = new Cache(new File(cachedirectory), cacheSize); //
static {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.connectTimeout(8, TimeUnit.SECONDS); //設定連線超時時間
builder.writeTimeout(8, TimeUnit.SECONDS);//設定寫入超時時間
builder.readTimeout(8, TimeUnit.SECONDS);//設定讀取資料超時時間
builder.retryOnConnectionFailure(false);//設定不進行連線失敗重試
builder.cache(cache);//這種快取
client = builder.build();
}
注意的是:okhttp只會對get請求進行快取,post請求是不會進行快取,這也是有道理的,因為get請求的資料一般是比較持久的,而post一般是互動操作,沒太大意義進行快取。
2.進行get請求:
一般來說的是,我們get請求有時有不一樣的需求,有時需要進行快取,有時需要直接從網路獲取,有時只獲取快取資料,這些處理,okhttp都有幫我們做了,我們做的只需要設定就是了。下面是整理的各種需求的設定與使用方法。
1.進行get請求,並將資料快取。
/**
*@param url
*@param cache_maxAge_inseconds 快取最大生存時間,單位為秒
*@return 當前call
*--------------------
*TODO get請求,並快取請求資料,返回的是快取資料,注意,如果超出了maxAge,快取會被清除,回撥onfail
*/
public static Call DoGetAndCache(String url,int cache_maxAge_inseconds) {
Request request = new Request.Builder()
.cacheControl(new CacheControl.Builder().maxAge(cache_maxAge_inseconds, TimeUnit.SECONDS).build())
.url(url).build();
Call call = client.newCall(request);
startrequest(call);
return call;
}
2.get請求,但只獲取返回網路資料。
/**
* get請求 ,只獲取返回網路請求資料,不進行快取
*
* @param url
* @param responseListener
*/
public static Call DoGetOnlyNet(String url) {
Request request = new Request.Builder()
.cacheControl(new CacheControl.Builder().maxAge(0, TimeUnit.SECONDS).build())
.url(url).build();
Call call = client.newCall(request);
startrequest(call);
return call;
}
3.進行get請求,並限制過時時間
/**
* get請求, 沒有超過過時時間StaleTime的話,返回快取資料,否則重新去獲取網路資料,StaleTime限制了預設資料fresh時間
* @param url
* @param staletime 過時時間,秒為單位
*/
public static Call DoGetInStaleTime(String url, int staletime) {
Request request = new Request.Builder()
.cacheControl(new CacheControl.Builder().maxStale(staletime, TimeUnit.SECONDS).build()).url(url).build();
Call call = client.newCall(request);
startrequest( call);
return call;
}
這裡說明下StaleTime與maxAge的區別。
StaleTime:指的是過時時間,設定它後,會將資料快取,如果沒有超過過時時間,說明資料還是新的,或直接拿快取資料返回,如果超過是過時時間,那麼我們認為資料過時了,它會去或者網路資料進行更新並返回,注意,它是不會刪除快取的。
maxAge:限制了快取的生存時間,超過了就會刪除該請求的快取。
4.只獲取返回快取資料
/**
* get請求, 只使用快取,注意,如果是超出了staletime或者超出了maxAge的話會返回504,否則就返回快取資料
* @param url
*/
public static Call DoGetOnlyCache(String url) {
Request request = new Request.Builder()
.cacheControl(new CacheControl.Builder().onlyIfCached().build()).url(url).build();
Call call = client.newCall(request);
startrequest(call);
return call;
startrequest(Call call0):
private static void startrequest(final Call call0) {
try {
call0.enqueue(new Callback() {
@Override
public void onFailure(Call arg0, IOException arg1) {
//請求失敗
}
@Override
public void onResponse(Call arg0, Response response) throws IOException {
//請求返回資料
}
});
} catch (Exception e) {
}
}