Android編程使用緩存優(yōu)化ListView的方法
本文實(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è)包裝類型.
在包裝類型里面的對(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)用的類型
只要一個(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)存中, //軟引用類型的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ì)有所幫助。
相關(guān)文章
android實(shí)現(xiàn)加載動(dòng)畫(huà)對(duì)話框
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)加載動(dòng)畫(huà)對(duì)話框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10popupwindow焦點(diǎn)問(wèn)題解決方案
在android 開(kāi)發(fā)過(guò)程中,總會(huì)遇到一些問(wèn)題,比如popupwindow焦點(diǎn)問(wèn)題等等,我們?cè)撊绾谓鉀Q呢?需要的朋友可以了解下2012-11-11Android開(kāi)發(fā)人臉識(shí)別登錄功能
這篇文章主要介紹了Android開(kāi)發(fā)人臉識(shí)別登錄功能,這個(gè)很多公司都在使用,非常流行,今天小編給大家從頭到尾做一個(gè)案例分享到腳本之家平臺(tái),需要的朋友參考下吧2019-11-11解決Android TabLayout 在寬屏幕上tab不能平均分配的問(wèn)題
這篇文章主要介紹了解決Android TabLayout 在寬屏幕上tab不能平均分配的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08Android APK 32位和64位的區(qū)別及說(shuō)明
這篇文章主要介紹了Android APK 32位和64位的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11Android編程開(kāi)發(fā)ScrollView中ViewPager無(wú)法正?;瑒?dòng)問(wèn)題解決方法
這篇文章主要介紹了Android編程開(kāi)發(fā)ScrollView中ViewPager無(wú)法正?;瑒?dòng)問(wèn)題解決方法,以實(shí)例形式分析了ScrollView中滑動(dòng)失效的原因及解決方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10flutter實(shí)現(xiàn)掃碼槍獲取數(shù)據(jù)源禁止系統(tǒng)鍵盤(pán)彈窗示例詳解
這篇文章主要為大家介紹了flutter實(shí)現(xiàn)掃碼槍獲取數(shù)據(jù)源禁止系統(tǒng)鍵盤(pán)彈窗示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01