Android使用緩存優化ListView

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;
		}
	}
相關文章
相關標籤/搜索