亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 3233 | 回復(fù): 0
打印 上一主題 下一主題

Android 中的緩存機(jī)制與實現(xiàn)(杰瑞教育原創(chuàng)) [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2015-02-03 08:59 |只看該作者 |倒序瀏覽
  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ò)操作,減少流量、提升性能。
一、二級緩存工作機(jī)制
  所謂二級緩存實際上并不復(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)
  如何實現(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ù)

您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP