Android開發(fā)本質(zhì)上就是手機(jī)和互聯(lián)網(wǎng)中的web服務(wù)器之間進(jìn)行通信,就必然需要從服務(wù)端獲取數(shù)據(jù),而反復(fù)通過網(wǎng)絡(luò)獲取數(shù)據(jù)是比較耗時的,特別是訪問比較多的時候,會極大影響了性能,Android中可通過二級緩存來減少頻繁的網(wǎng)絡(luò)操作,減少流量、提升性能。 所謂二級緩存實際上并不復(fù)雜,當(dāng)Android端需要獲得數(shù)據(jù)時比如獲取網(wǎng)絡(luò)中的圖片,我們首先從內(nèi)存中查找(按鍵查找),內(nèi)存中沒有的再從磁盤文件或sqlite中去查找,若磁盤中也沒有才通過網(wǎng)絡(luò)獲;當(dāng)獲得來自網(wǎng)絡(luò)的數(shù)據(jù),就以key-value對的方式先緩存到內(nèi)存(一級緩存),同時緩存到文件或sqlite中(二級緩存)。注意:內(nèi)存緩存會造成堆內(nèi)存泄露,所有一級緩存通常要嚴(yán)格控制緩存的大小,一般控制在系統(tǒng)內(nèi)存的1/4。 理解了二級緩存大家可能會有個問題網(wǎng)絡(luò)中的數(shù)據(jù)是變化的,數(shù)據(jù)一旦放入緩存中,再取該數(shù)據(jù)就是從緩存中獲得,這樣豈不是不能體現(xiàn)數(shù)據(jù)的變化?我們在緩存數(shù)據(jù)時會設(shè)置有效時間,比如說30分鐘,若超過這個時間數(shù)據(jù)就失效并釋放空間,然后重新請求網(wǎng)絡(luò)中的數(shù)據(jù)。有的童鞋就問30分鐘內(nèi)咋辦?那好吧,我也沒招了,只有下拉刷新了, 實際上這不是問題。 如何實現(xiàn)二級緩存,有很多技術(shù)方案,在這里我們使用 ASimpleCache框架來給大家演示一下,通過名字就可以看出它是很容易實現(xiàn)的。 1、ACache介紹 ASimpleCache是一個輕量級的開源cache框架,實際上就是一個叫ACache的java類。已經(jīng)在商業(yè)項目中使用,運行效果不錯。 2、ACache使用 我們先做一個實現(xiàn)數(shù)據(jù)緩存的案例,然后再歸納一下主要的方法 編寫NewsListActivity主要代碼如下: Java Code復(fù)制內(nèi)容到剪貼板
- public class NewsListActivity extends Activity {
- private List<News> list;
- private ListView listView;
- private LoadImageAdapter adapter;//適配器
- private ACache acache;//緩存框架
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- super.setContentView(R.layout.load_img_listview_activity);
- acache=ACache.get(this);//創(chuàng)建ACache組件
- initView();//初始化界面,代碼不貼了
- }
-
- public void loadData(){
- String cacheData=acache.getAsString("newsList");//從緩存中取數(shù)據(jù)
- if(cacheData!=null){//如果緩存中有,就不訪問網(wǎng)絡(luò)
- List<News> newsList=gson.fromJson(cacheData, new TypeToken<List<News>>(){}.getType());//將json轉(zhuǎn)為List
- list.addAll(newsList);
- adapter.notifyDataSetChanged();
- return;
- }
- new Thread(new Runnable() {
- @Override
- public void run() {
- // TODO Auto-generated method stub
- SystemClock.sleep(2000);//模擬網(wǎng)絡(luò)耗時
- String json=request();//模擬從網(wǎng)絡(luò)中獲取json數(shù)據(jù)
- acache.put("newslist", json, 60*60*1);//將數(shù)據(jù)存入緩存中,有效時間設(shè)置為1小時
- List<News> newsList=gson.fromJson(json, new TypeToken<List<News>>(){}.getType());
- list.addAll(newsList);
- handler.sendEmptyMessage(1);
- }
-
- }).start();
- }
- /**
- * 模擬網(wǎng)絡(luò)請求方法
- * @return json數(shù)據(jù)
- */
- private String request(){
- News news=null;
- for(int i=0;i<10;i++){
- news=new News();
- news.setId(i);
- news.setImgUrl("course/img/face_"+i+".png");
- news.setTitle("新聞標(biāo)題"+i);
- news.setSummary("測試"+i);
- list.add(news);
- }
- Gson gson=new Gson();
- return gson.toJson(list);
- }
-
- private Handler handler=new Handler()
- @Override
- public void handleMessage(Message msg) {
- // TODO Auto-generated method stub
- switch(msg.what){
- case 1:
- notify_layout.setVisibility(View.GONE);
- adapter.notifyDataSetChanged();
- break;
- }
- }
- }
紅色部分就是ASimpleCache實現(xiàn)緩存數(shù)據(jù)的代碼,下面我們說一下主要代碼
1、 創(chuàng)建ACache組件 ACache acache=ACache.get(context) 或 ACache acache=ACache.get(context,max_size,max_count) 參數(shù)說明: max_size:設(shè)置限制緩存大小,默認(rèn)為50M max_count:設(shè)置緩存數(shù)據(jù)的數(shù)量,默認(rèn)不限制 2、 設(shè)置緩存數(shù)據(jù) acache.put(key,data,time)或acache.put(key,data) 將數(shù)據(jù)同時上存入一級緩存(內(nèi)存Map)和二級緩存(文件)中 參數(shù)說明: Key:為存入緩存的數(shù)據(jù)設(shè)置唯一標(biāo)識,取數(shù)據(jù)時就根據(jù)key來獲得的 Data:要存入的數(shù)據(jù),acache支持的數(shù)據(jù)類型如圖所示: ![]()
有String、可序列化的對象、字節(jié)數(shù)組、Drawable等
Time:設(shè)置緩存數(shù)據(jù)的有效時間,單位秒 3、 從緩存中取數(shù)據(jù) 提供一系列g(shù)etAsXXX()方法,如圖所示 根據(jù)不同存入數(shù)據(jù),調(diào)用不同的方法取數(shù)據(jù)
|