使用方法很簡單:
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 = **;//緩存檔案最大限制大小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(, TimeUnit.SECONDS); //設定連接配接逾時時間
builder.writeTimeout(, TimeUnit.SECONDS);//設定寫入逾時時間
builder.readTimeout(, 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(, 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) {
}
}