解決問題,固然得發現它的前因後果才行。php
Andorid開發中,會用LogCat,會幫你高效率解決問題。java
先分享一段從url獲取圖片的一個類的代碼:android
package com.eoeandroid.hitap; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import android.graphics.Bitmap; import android.graphics.BitmapFactory; public class DownLoadAImage { String filePath; DownLoadAImage(String filePath){ this.filePath = filePath; } public Bitmap seizeImage() throws Exception { URL url = null; InputStream in = null; Bitmap bitmap = null; try { try { url = new URL(filePath); } catch(MalformedURLException e) { e.printStackTrace(); } HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoInput(true); conn.setConnectTimeout(5000); conn.setRequestMethod("GET"); conn.connect(); in = conn.getInputStream(); bitmap = BitmapFactory.decodeStream(in); in.close(); } catch (IOException e1) { e1.printStackTrace(); }finally{ try { if(in != null) in.close(); } catch (IOException e) { e.printStackTrace(); } } return bitmap; } }
可是,後面在一個app中須要加載多個圖片,此時老是Applaction unexpectedly stopped.app
追蹤Logcat,發現顯示內存溢出。函數
好吧,google!優化
原來this
圖片加載內存優化方案:google
1,儘可能不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource來設置一張大圖,url
由於這些函數在完成decode後,最終都是經過java層的createBitmap來完成的,須要消耗更多內存。.net
所以,改用先經過BitmapFactory.decodeStream方法,建立出一個bitmap,再將其設爲ImageView的 source,decodeStream最大的祕密在於其直接調用JNI>>nativeDecodeAsset()來完成decode,
無需再使用java層的createBitmap,從而節省了java層的空間。
2,若是在讀取時加上圖片的Config參數,能夠跟有效減小加載的內存,從而跟有效阻止拋out of Memory異常
另外,decodeStream直接拿的圖片來讀取字節碼了, 不會根據機器的各類分辨率來自動適應,
使用了decodeStream以後,須要在hdpi和mdpi,ldpi中配置相應的圖片資源,
不然在不一樣分辨率機器上都是一樣大小(像素點數量),顯示出來的大小就不對了。
因此,能夠進行下面的調整:
InputStream is = this.getResources().openRawResource(R.drawable.pic1); BitmapFactory.Options options=new BitmapFactory.Options(); options.inJustDecodeBounds = false; options.inSampleSize = 10; //width,hight設爲原來的十分一 Bitmap btp =BitmapFactory.decodeStream(is,null,options);
固然,合適的時候及時釋放內存,也是不錯的選擇:
if(!bmp.isRecycle() ) { bmp.recycle() //回收圖片所佔的內存 system.gc() //提醒系統及時回收 }
替換剛開始提到的代碼,ok,Gallery順利加載多張圖片,問題解決,只是圖像變得模糊了。
固然,android堆內存的相關問題,能夠參考:
http://www.eoeandroid.com/forum.php?mod=viewthread&tid=159376
好了,晚安!