所謂二級(jí)緩存機(jī)制伊群,即當(dāng)Android端需要獲得數(shù)據(jù)時(shí)吨娜,首先從內(nèi)存中查找(按鍵查找),內(nèi)存中沒(méi)有的再?gòu)拇疟P(pán)文件或sqlite中去查找娄徊,若磁盤(pán)中也沒(méi)有才通過(guò)網(wǎng)絡(luò)獲取瀑罗。
當(dāng)獲得來(lái)自網(wǎng)絡(luò)的數(shù)據(jù)胸嘴,就以key-value對(duì)的方式先緩存到內(nèi)存(一級(jí)緩存),同時(shí)緩存到文件或sqlite中(二級(jí)緩存)斩祭。
內(nèi)存緩存會(huì)造成堆內(nèi)存泄露劣像,所以一級(jí)緩存通常要嚴(yán)格控制緩存的大小。
ASimpleCache是一個(gè)輕量級(jí)的開(kāi)源cache框架摧玫,作者將其簡(jiǎn)化封裝成一個(gè)簡(jiǎn)單ACache的java類(lèi)耳奕。
private ACache acache;
acache = ACache.get(getActivity());
JSONObject cache_List = (JSONObject) acache.getAsJSONObject("list");
if(cache_List != null) {
CHBRsp result = new CHBRsp(CHBRsp.CodeSucess, "", cache_List );
loadDataSucess(result);
} else{
onRefresh();
}
private void loadDataSucess(CHBRsp result) {
//如果下拉刷新成功請(qǐng)求到數(shù)據(jù),則緩存起來(lái)
if(page == 1) {
JSONObject json = result.tryExtra(JSONObject.class);
//緩存時(shí)效性為6小時(shí)
acache.put("list", json, 60*60*6);
}
//*******
}
在一些不是非常需求時(shí)效性的展示頁(yè)面诬像,首次進(jìn)入頁(yè)面的時(shí)候屋群,先尋找緩存,將其加載到頁(yè)面颅停,無(wú)需請(qǐng)求網(wǎng)絡(luò)數(shù)據(jù)谓晌。當(dāng)用戶(hù)需要刷新的時(shí)候掠拳,可以通過(guò)下拉刷新等請(qǐng)求最新數(shù)據(jù)onRefresh癞揉,并將本次刷新的數(shù)據(jù)再次緩存,重置時(shí)效時(shí)間6小時(shí)溺欧。當(dāng)過(guò)了時(shí)效性的時(shí)候喊熟,用戶(hù)再進(jìn)入本頁(yè)面,將無(wú)法取得緩存數(shù)據(jù)姐刁,而直接onRefresh請(qǐng)求網(wǎng)絡(luò)數(shù)據(jù)芥牌。(類(lèi)似于新浪微博,離線(xiàn)也可以查看最后一次刷新停留的頁(yè)面數(shù)據(jù)聂使。)
//設(shè)置緩存數(shù)據(jù)壁拉,存入一二級(jí)緩存,可以設(shè)置時(shí)效
acache.put(key,data,time)或acache.put(key,data)
//取出對(duì)應(yīng)數(shù)據(jù)柏靶,比如JSONObject等
acache.getAsJSONObject("list")