Android加载多图片内存溢出之不完美解决---图片清晰度受损

解决问题,当然得发现它的来龙去脉才行。

Andorid开发中,会用LogCat,会帮你高效率解决问题。

先分享一段从url获取图片的一个类的代码:

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.

追踪Logcat,发现显示内存溢出。

 

好吧,google!

原来

图片加载内存优化方案:

1,尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,

因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存。

因此,改用先通过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

好了,晚安!

转载于:https://my.oschina.net/u/250670/blog/56695

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值