国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

Android編程使用緩存優(yōu)化ListView的方法

2020-04-11 11:05:57
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文實(shí)例講述了Android編程使用緩存優(yōu)化ListView的方法。分享給大家供大家參考,具體如下:

ListView調(diào)用Adapter的getView方法獲取每一個(gè)Item布局,將這些已經(jīng)獲得的Item布局放入緩存,將大大提高獲取數(shù)據(jù)的效率,而且節(jié)省更多的流量,將數(shù)據(jù)進(jìn)行緩存有兩種方法是,一種是將內(nèi)存緩存一種是sd卡緩存,在此分別進(jìn)行演示。

sd卡緩存:

sd卡緩存是將下載的數(shù)據(jù)保存到sd卡中,當(dāng)再次要獲取數(shù)據(jù)時(shí),首先要判斷sd卡中是否存在,如果存在的話,就直接讀取sd卡中的數(shù)據(jù),如果不存在就從網(wǎng)上下載,然后保存到sd卡中

內(nèi)存緩存:

內(nèi)存優(yōu)化是將獲取到的數(shù)據(jù)存取到Map集合中,如果再次引用此數(shù)據(jù),就直接從Map集合中獲取,這樣會(huì)導(dǎo)致一個(gè)問(wèn)題,如果Map集合中的數(shù)據(jù)特別多,比如存取了100萬(wàn)條數(shù)據(jù),這樣有可能就會(huì)導(dǎo)致內(nèi)存溢出。這是因?yàn)镸ap集合是強(qiáng)引用的集合,如何不把Map集合置為空的話,這個(gè)集合Java虛擬機(jī)就不會(huì)把它回收掉,當(dāng)Map中的數(shù)據(jù)大小超過(guò)了內(nèi)存大小就會(huì)導(dǎo)致內(nèi)存溢出。為了避免這種異常我們要使用軟引用softreference ,軟引用和強(qiáng)引用的區(qū)別如下:

1. softreference 他是java虛擬機(jī)給我們提供的一個(gè)包裝類(lèi)型.

在包裝類(lèi)型里面的對(duì)象 一般情況下 ,java虛擬機(jī)會(huì)盡量長(zhǎng)時(shí)間的保留這個(gè)對(duì)象
當(dāng)java虛擬機(jī)內(nèi)存不足的時(shí)候 java虛擬機(jī)就會(huì)回收 softreference里面的對(duì)象

2. hardreference 默認(rèn)new出來(lái)的對(duì)象 都是這種強(qiáng)應(yīng)用的類(lèi)型

只要一個(gè)對(duì)象還保留的有引用,他就不會(huì)被垃圾回收

Map<String,Bitmap> map;

核心代碼:

sd卡緩存

public class MyReadAdapter extends BaseAdapter{ private List<CollectionEntry> entrys; public MyReadAdapter(CollectionFeed feeds) {  entrys = feeds.getEntries(); } public int getCount() {  return entrys.size(); } public Object getItem(int position) {  return entrys.get(position); } public long getItemId(int position) {  return position; } public View getView(int position, View convertView, ViewGroup parent) {  View view = infalter.inflate(R.layout.myread_item, null);  final ImageView iv = (ImageView) view.findViewById(R.id.book_img);  //獲取數(shù)據(jù)實(shí)體  CollectionEntry ce = entrys.get(position);  //獲取圖片地址  String iconurl = ce.getSubjectEntry().getLink("image", null).getHref();  int start = iconurl.lastIndexOf("/");  int end = iconurl.length();  final String iconname = iconurl.substring(start, end);  //Environment.getExternalStorageDirectory()這個(gè)是sd卡目錄  File file = new File(Environment.getExternalStorageDirectory(),iconname);  //獲取sd卡緩存  if(file.exists()){   iv.setImageURI(Uri.fromFile(file));   Log.i(TAG,"使用sd卡圖片");  }else{   new LoadImageAsynTask(new ImageTaskCallback() {   // 圖片獲取之后   public void onImageLoaded(Bitmap bitmap) {    if(bitmap!=null){    iv.setImageBitmap(bitmap);    //把圖片存到sd卡上    if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){     try {      File file = new File(Environment.getExternalStorageDirectory(),iconname);      FileOutputStream fos = new FileOutputStream(file);      bitmap.compress(CompressFormat.JPEG, 100, fos);     } catch (Exception e) {      e.printStackTrace();     }    }    }else{     iv.setImageResource(R.drawable.book);    }   }   //圖片獲取之前   public void beforeImageLoaded() {    iv.setImageResource(R.drawable.book);   }  }).execute(iconurl);  }  return view; }}

內(nèi)存緩存

Map<String,SoftReference<Bitmap>> map;public class MyReadAdapter extends BaseAdapter{ private List<CollectionEntry> entrys; public MyReadAdapter(CollectionFeed feeds) {  entrys = feeds.getEntries(); } public int getCount() {  return entrys.size(); } public Object getItem(int position) {  return entrys.get(position); } public long getItemId(int position) {  return position; } public View getView(int position, View convertView, ViewGroup parent) {  View view = infalter.inflate(R.layout.myread_item, null);  final ImageView iv = (ImageView) view.findViewById(R.id.book_img);  //獲取到數(shù)據(jù)的實(shí)體  CollectionEntry ce = entrys.get(position);  //獲取到圖片的Url  String iconurl = ce.getSubjectEntry().getLink("image", null).getHref();  int start = iconurl.lastIndexOf("/");  int end = iconurl.length();  final String iconname = iconurl.substring(start, end);  //使用內(nèi)存緩存  if(map!=null && map.get(iconname)!=null){   iv.setImageBitmap(map.get(iconname).get());   Log.i(TAG,"使用內(nèi)存緩存");  }  else{  new LoadImageAsynTask(new ImageTaskCallback() {   // 圖片獲取之后   public void onImageLoaded(Bitmap bitmap) {    if(bitmap!=null){    iv.setImageBitmap(bitmap);    //存放到內(nèi)存中,    //軟引用類(lèi)型的bitmap    map.put(iconname, new SoftReference<Bitmap>(bitmap));    }else{     iv.setImageResource(R.drawable.book);    }   }   //圖片獲取之前   public void beforeImageLoaded() {    iv.setImageResource(R.drawable.book);   }  }).execute(iconurl);  }  return view; }}

希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 勃利县| 什邡市| 寻甸| 镇雄县| 容城县| 栾川县| 亳州市| 巴马| 肇州县| 东乡县| 河源市| 五台县| 眉山市| 东台市| 长阳| 芷江| 清远市| 嘉峪关市| 日喀则市| 新安县| 江口县| 安丘市| 庆云县| 盐山县| 丰县| 绥阳县| 平塘县| 湘西| 息烽县| 合作市| 岳池县| 江山市| 右玉县| 扎赉特旗| 湘潭县| 威海市| 三台县| 秭归县| 屏山县| 洞口县| 抚州市|