Android 中的緩衝機制與實現,android緩衝

來源:互聯網
上載者:User

Android 中的緩衝機制與實現,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()方法,

 

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

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.