Android加載多圖片內存溢出之不完美解決---圖片清晰度受損

解決問題,固然得發現它的前因後果才行。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

好了,晚安!

相關文章
相關標籤/搜索