在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);