編輯:關於Android編程
本文實例講述了Android編程使用緩存優化ListView的方法。分享給大家供大家參考,具體如下:
ListView調用Adapter的getView方法獲取每一個Item布局,將這些已經獲得的Item布局放入緩存,將大大提高獲取數據的效率,而且節省更多的流量,將數據進行緩存有兩種方法是,一種是將內存緩存一種是sd卡緩存,在此分別進行演示。
sd卡緩存:
sd卡緩存是將下載的數據保存到sd卡中,當再次要獲取數據時,首先要判斷sd卡中是否存在,如果存在的話,就直接讀取sd卡中的數據,如果不存在就從網上下載,然後保存到sd卡中
內存緩存:
內存優化是將獲取到的數據存取到Map集合中,如果再次引用此數據,就直接從Map集合中獲取,這樣會導致一個問題,如果Map集合中的數據特別多,比如存取了100萬條數據,這樣有可能就會導致內存溢出。這是因為Map集合是強引用的集合,如何不把Map集合置為空的話,這個集合Java虛擬機就不會把它回收掉,當Map中的數據大小超過了內存大小就會導致內存溢出。為了避免這種異常我們要使用軟引用softreference ,軟引用和強引用的區別如下:
1. softreference 他是java虛擬機給我們提供的一個包裝類型.
在包裝類型裡面的對象 一般情況下 ,java虛擬機會盡量長時間的保留這個對象
當java虛擬機內存不足的時候 java虛擬機就會回收 softreference裡面的對象
2. hardreference 默認new出來的對象 都是這種強應用的類型
只要一個對象還保留的有引用,他就不會被垃圾回收
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); //獲取數據實體 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()這個是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; } }
內存緩存
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); //獲取到數據的實體 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); //使用內存緩存 if(map!=null && map.get(iconname)!=null){ iv.setImageBitmap(map.get(iconname).get()); Log.i(TAG,"使用內存緩存"); } else{ new LoadImageAsynTask(new ImageTaskCallback() { // 圖片獲取之後 public void onImageLoaded(Bitmap bitmap) { if(bitmap!=null){ iv.setImageBitmap(bitmap); //存放到內存中, //軟引用類型的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; } }
希望本文所述對大家Android程序設計有所幫助。
這篇文章主要介紹在實際Android應用程序的開發中,容易導致內存洩露的一些情況。開發人員如果在進行代碼編寫之前就有內存洩露方面的基礎知 識,那麼
(一).前言:這幾天正在更新錄制實戰項目,整體框架是采用仿照QQ5.X側滑效果的。那麼我們一般的做法就是自定義ViewGroup或者采用開源項目MenuDra
一 前言??把android開發藝術探索第三章閱讀了,對事件分發機制有一個大概的了解,關於事件分發的文章也很多,自己也看了一些相關的文章,決定自己分析一遍記錄下來,加深映
一、效果:我們看到很多軟件的通訊錄在右側都有一個字母索引功能,像微信,小米通訊錄,QQ,還有美團選擇地區等等。這裡我截了一張美團選擇城市的圖片來看看; 我們今天就來實現