android开发中如果加载一张较大的图片直接内存爆炸,我也是头疼了好长时间,以下是我找到的的解决方案。
完整解决方案地址:https://my.oschina.net/u/1389206/blog/324731
设置 读取图片的参数,使用decodeStream进行图片读取。
尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存。 因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的 source,decodeStream最大的秘密在于其直接调用JNI>>nativeDecodeAsset()来完成decode,无需再使用java层的createBitmap,从而节省了java层的空间。
使用方式:
public static Bitmap readBitMap(Context context, int resId) {
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Bitmap.Config.RGB_565;
opt.inPurgeable = true;
opt.inInputShareable = true;
// 获取资源图片
InputStream is = context.getResources().openRawResource(resId);
return BitmapFactory.decodeStream(is, null, opt);
}
对于RGB565的说明:http://blog.csdn.net/xiaoyaovsxin/article/details/8446698
使用完资源后在ondestroy进行释放:
protected void onDestroy() {
//BitmapDrawable drawable= (BitmapDrawable) layout.getBackground();
//Bitmap bitmap=drawable.getBitmap();
//先取得图片资源再调用一下内容
if(bitmap!=null&&!bitmap.isRecycled()) { bitmap.recycle(); bitmap=null; drawable=null; } System.gc(); super.onDestroy(); }