Android 中的緩存機制與實現

Android開發本質上就是手機和互聯網中的web服務器之間進行通信,就必然需要從服務端獲取數據,而反覆通過網絡獲取數據是比較耗時的,特別是訪問比較多的時候,會極大影響了性能,Android中可通過二級緩存來減少頻繁的網絡操作,減少流量、提升性能。

一、二級緩存工作機制

  所謂二級緩存實際上並不複雜,當Android端需要獲得數據時比如獲取網絡中的圖片,我們首先從內存中查找(按鍵查找),內存中沒有的再從磁盤文件或sqlite中去查找,若磁盤中也沒有才通過網絡獲取;當獲得來自網絡的數據,就以key-value對的方式先緩存到內存(一級緩存),同時緩存到文件或sqlite中(二級緩存)。注意:內存緩存會造成堆內存泄露,所有一級緩存通常要嚴格控制緩存的大小,一般控制在系統內存的1/4。

  理解了二級緩存大家可能會有個問題網絡中的數據是變化的,數據一旦放入緩存中,再取該數據就是從緩存中獲得,這樣豈不是不能體現數據的變化?我們在緩存數據時會設置有效時間,比如說30分鐘,若超過這個時間數據就失效並釋放空間,然後重新請求網絡中的數據。有的童鞋就問30分鐘內咋辦?那好吧,我也沒招了,只有下拉刷新了, 實際上這不是問題。

二、二級緩存的實現

  如何實現二級緩存,有很多技術方案,在這裏我們使用 ASimpleCache框架來給大家演示一下,通過名字就可以看出它是很容易實現的。

1、ACache介紹 

  ASimpleCache是一個輕量級的開源cache框架,實際上就是一個叫ACache的java類。已經在商業項目中使用,運行效果不錯。

  下載地址:https://github.com/yangfuhai/ASimpleCache

2、ACache使用

  我們先做一個實現數據緩存的案例,然後再歸納一下主要的方法

  編寫NewsListActivity主要代碼如下:


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);//創建ACache組件
    initView();//初始化界面,代碼不貼了
}

public void loadData(){
   String cacheData=acache.getAsString("newsList");//從緩存中取數據
   if(cacheData!=null){//如果緩存中有,就不訪問網絡
   List<News> newsList=gson.fromJson(cacheData, new TypeToken<List<News>>(){}.getType());//將json轉爲List
      list.addAll(newsList);
      adapter.notifyDataSetChanged();
      return;
   }
   new Thread(new Runnable() {
     @Override
     public void run() {
       // TODO Auto-generated method stub
       SystemClock.sleep(2000);//模擬網絡耗時
       String json=request();//模擬從網絡中獲取json數據
       acache.put("newslist", json, 60*60*1);//將數據存入緩存中,有效時間設置爲1小時
       List<News> newsList=gson.fromJson(json, new TypeToken<List<News>>(){}.getType());
       list.addAll(newsList);
       handler.sendEmptyMessage(1);
    }
         
  }).start();
}
    /**
     * 模擬網絡請求方法
     * @return json數據
     */
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("新聞標題"+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實現緩存數據的代碼,下面我們說一下主要代碼

1、 創建ACache組件

  

ACache   acache=ACache.get(context)
      或
  ACache   acache=ACache.get(context,max_size,max_count)

參數說明:  

  max_size:設置限制緩存大小,默認爲50M

  max_count:設置緩存數據的數量,默認不限制 

2、 設置緩存數據 

  acache.put(key,data,time)或acache.put(key,data)

  將數據同時上存入一級緩存(內存Map)和二級緩存(文件)中

參數說明:  

  Key:爲存入緩存的數據設置唯一標識,取數據時就根據key來獲得的

  Data:要存入的數據,acache支持的數據類型如圖所示:


  有String、可序列化的對象、字節數組、Drawable等
  Time:設置緩存數據的有效時間,單位秒

3、 從緩存中取數據

  提供一系列getAsXXX()方法,如圖所示

 

  根據不同存入數據,調用不同的方法取數據

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章