ListView調用Adapter的getView方法獲取每個Item佈局,將這些已經得到的Item佈局放入緩存,將大大提升獲取數據的效率,並且節省更多的流量,將數據進行緩存有兩種方法是,一種是將內存緩存一種是sd卡緩存,在此分別進行演示。java
sd卡緩存:緩存
sd卡緩存是將下載的數據保存到sd卡中,當再次要獲取數據時,首先要判斷sd卡中是否存在,若是存在的話,就直接讀取sd卡中的數據,若是不存在就從網上下載,而後保存到sd卡中佈局
內存緩存:優化
內存優化是將獲取到的數據存取到Map集合中,若是再次引用此數據,就直接從Map集合中獲取,這樣會致使一個問題,若是Map集合中的數據特別多,好比存取了100萬條數據,這樣有可能就會致使內存溢出。這是由於Map集合是強引用的集合,如何不把Map集合置爲空的話,這個集合Java虛擬機就不會把它回收掉,當Map中的數據大小超過了內存大小就會致使內存溢出。爲了不這種異常咱們要使用軟引用softreference ,軟引用和強引用的區別以下:url
1. softreference 他是java虛擬機給咱們提供的一個包裝類型.
在包裝類型裏面的對象 通常狀況下 ,java虛擬機會盡可能長時間的保留這個對象
當java虛擬機內存不足的時候 java虛擬機就會回收 softreference裏面的對象code
2. hardreference 默認new出來的對象 都是這種強應用的類型
只要一個對象還保留的有引用,他就不會被垃圾回收
Map<String,Bitmap> map;orm
核心代碼:對象
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; } }