首先要提一下,本文中的緩存指的只是文本緩存。訪問服務器使用http請求。
android裏面使用緩存的好處:
1.節省流量
2.更快的響應,更流暢的體驗。
3.減少http請求,降低服務器負擔。
(如果一個應用啓動到關閉共發起50次http請求,啓用緩存後降低到了30次。我想緩存帶來的效益要比你優化數據庫表結構什麼的優更加直接有效)
說到緩存,有幾個必須提到的要點。
首先,每個緩存有應該有個id號,這樣我們才能找到它或者刪除它。
其次,既然是緩存,那必須有一個自己的生命週期或者說是有效期,這樣緩存才能保持緩存的不斷更新。
在android中應該用什麼做緩存的id?什麼做緩存?最簡單直接的是用url做緩存id,用json做緩存內容。
比如請求一個商品id爲1的商品信息的url是http://www.xxx.com?gid=1,獲得的json數據格式{id:1,name:"一號商品",desc:"商品描述"}。這樣下次在發起同樣的http請求的時候,就不用從服務器獲取數據了,直接根據url從本地找到對應的json即可。這裏還有一點沒說的就是緩存存儲的問題。最簡單的方式當然是存數據庫,一張表兩個字段。一個url,一個json。url設爲主鍵,找緩存就是根據url找json了。
url | json | |
1 | http://www.xxx.com?gid=1 | {id:1,name:"一號商品",desc:"商品描述"} |
2 | http://www.xxx.com?gid=2 | {id:2,name:"二號商品",desc:"商品描述"} |
3 | http://www.xxx.com?gid=3 | {id:3,name:"三號商品",desc:"商品描述"} |
4 | http://www.xxx.com?gid=4 | {id:4,name:"四號商品",desc:"商品描述"} |
5 | http://www.xxx.com?gid=5 | {id:5,name:"五號商品",desc:"商品描述"} |
爲了讓大家更好理解,一直沒有說的太多。現在開始講點複雜的。
剛纔說到緩存還應該有個有效期。比如我設定的緩存的有效時間是2個小時。我可以用當前的時間減去上次緩存記錄時的時間,看看這個時差是否大於兩個小時即可。這樣我們不得不修改一下緩存表
url | json | lastmodified | |
1 | http://www.xxx.com?gid=1 | {id:1,name:"一號商品",desc:"商品描述"} | 1388824029 |
2 | http://www.xxx.com?gid=2 | {id:2,name:"二號商品",desc:"商品描述"} | 1388824030 |
3 | http://www.xxx.com?gid=3 | {id:3,name:"三號商品",desc:"商品描述"} | 1388824031 |
4 | http://www.xxx.com?gid=4 | {id:4,name:"四號商品",desc:"商品描述"} | 1388824032 |
5 | http://www.xxx.com?gid=5 | {id:5,name:"五號商品",desc:"商品描述"} | 1388824033 |
表中的lastmodified就是緩存記錄的時間,獲取時間的方法System.currentTimeMillis();
現在就屢下邏輯:
首先是將要發起一個http請求(get請求),根據這個請求的url去數據庫緩存表中查找有沒有這條記錄。如果沒有,發起http請求。如果有,判讀是否在有效期內,在有效期內直接使用,不在有效期,發起http請求。
自己對應緩存有效性的邏輯中認爲:如果沒有網絡的情況下,即使緩存超過有效期也視爲緩存有效。
除了利用數據庫做緩存外還可以利用文件做緩存。
get請求的url作爲文件名,請求的內容(如json)寫入文件。這裏要有些變通。以爲文件名不能存在特殊字符所以可以把url進行MD5加密後的字符串作爲文件名,寫入文件的內容亦可以是json解析後的JavaBean再進行序列化。每個文件都有個最後修改時間,我們可以利用文件的這個屬性來判斷緩存的有效性。