尽量不要使用 setImageBitmap 或 setImageResource 或 BitmapFactory.decodeResource 来设置一张大图, 因为这些函数在完成 decode 后, 最终都是通过 java 层的 createBitmap 来完成的, 需要消耗更多内存.
因此, 改用先通过 BitmapFactory.decodeStream 方法, 创建出一个 bitmap, 再将其设为 ImageView 的 source,decodeStream 最大的秘密在于其直接调用 JNI>>nativeDecodeAsset() 来完成 decode, 无需再使用 java 层的 createBitmap, 从而节省了 java 层的空间.
如果在读取时加上图片的 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() // 提醒系统及时回收
- }
来源: http://www.bubuko.com/infodetail-2635657.html