android異步加載圖片並緩存到本地實現方法

在android項目中訪問網絡圖片是很是廣泛性的事情,若是咱們每次請求都要訪問網絡來獲取圖片,會很是耗費流量,並且圖片佔用內存空間也比較大,圖片過多且不釋放的話很容易形成內存溢出。針對上面遇到的兩個問題,首先耗費流量咱們能夠將圖片第一次加載上面緩存到本地,之後若是本地有就直接從本地加載。圖片過多形成內存溢出,這個是最不容易解決的,要想一些好的緩存策略,好比大圖片使用LRU緩存策略或懶加載緩存策略。今天首先介紹一下本地緩存圖片。 java

網絡類 android

public class HttpUtils {
	public static InputStream getISFromURL(String imageURL) {
		InputStream in = null;
		try {
			URL url = new URL(imageURL);
			HttpURLConnection connection = (HttpURLConnection) url.openConnection();
			in = connection.getInputStream();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return in;
	}
}

異步加載類 緩存

public class AsyncBitmapLoader {
	public interface ImageCallBack {
		public void imageLoad(ImageView imageView, Bitmap bitmap);
	}

	/**
	 * 內存圖片軟引用緩衝
	 */
	private HashMap<String, SoftReference<Bitmap>> imageCache = null;
	private String cachePath = "/mnt/sdcard/test/";

	public AsyncBitmapLoader() {
		imageCache = new HashMap<String, SoftReference<Bitmap>>();
	}

	public Bitmap loadBitmap(final ImageView view, final String imageURL, final ImageCallBack imageCallBack) {
		final String bitmapName = imageURL.substring(imageURL.lastIndexOf("/") + 1);
		// 在內存緩衝中,則返回Bitmap
		if (imageCache.containsKey(imageURL)) {
			SoftReference<Bitmap> reference = imageCache.get(imageURL);
			Bitmap bitmap = reference.get();
			if (bitmap != null)
				return bitmap;
		} else {
			// 加上一個對本地緩存的查找
			File cacheDir = new File(cachePath);
			File[] cacheFiles = cacheDir.listFiles();
			int i = 0;
			if (cacheFiles != null) {
				for (; i < cacheFiles.length; i++) {
					if (bitmapName.equals(cacheFiles[i].getName())) {
						break;
					}
				}
				if (i < cacheFiles.length) {
					return BitmapFactory.decodeFile(cachePath + bitmapName);
				}
			}
		}
		// 本地爲找到,繼續
		final Handler handler = new Handler() {
			@Override
			public void handleMessage(Message msg) {
				imageCallBack.imageLoad(view, (Bitmap) msg.obj);
			}
		};

		new Thread() {
			@Override
			public void run() {
				InputStream is = HttpUtils.getISFromURL(imageURL);
				Bitmap bitmap = BitmapFactory.decodeStream(is);
				imageCache.put(imageURL, new SoftReference<Bitmap>(bitmap));
				Message msg = handler.obtainMessage(0, bitmap);
				handler.sendMessage(msg);
				File dir = new File(cachePath);
				if (!dir.exists()) {
					dir.mkdirs();
				}
				File bitmapFile = new File(bitmapName);
				if (!bitmapFile.exists()) {
					try {
						bitmapFile.createNewFile();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
				FileOutputStream fos;
				try {
					fos = new FileOutputStream(bitmapFile);
					bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
					fos.close();
				} catch (FileNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}.start();
		return null;
	}
}

主調用 網絡

AsyncBitmapLoader asyncBitmapLoader = null;
		ImageView view = null;
		String imageURL = "";
		Bitmap bitmap = asyncBitmapLoader.loadBitmap(view, imageURL, new ImageCallBack() {

			@Override
			public void imageLoad(ImageView imageView, Bitmap bitmap) {
				imageView.setImageBitmap(bitmap);
			}
		});
		if (bitmap == null)
			view.setImageResource(R.drawable.ic_action_search);
		else
			view.setImageBitmap(bitmap);
相關文章
相關標籤/搜索