Bitmap exceeds VM budget 的麻烦

from yzw@iw
在ImageView类中,尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存。

因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的source,decodeStream最大的秘密在于其直接调用
>> native code --
>> nativeDecodeAsset()来完成decode,无需再使用java层的createBitmap,从而节省了java层的空间

另外,下面这个也有说:

http://li53262182.blog.163.com/blog/static/12839338720104614142427/

out of Memory:bitmap size exceed vm limitation
1. InputStream is = this.getResources().openRawResource(R.drawable.pic1);
        BitmapFactory.Options options=new BitmapFactory.Options();
        options.inJustDecodeBounds = false;
        options.inSampleSize = 10;
        Bitmap btp =BitmapFactory.decodeStream(is,null,options);
2. bmp.recycle()
3. system.gc()

如果是要从sdcard中读取图片,可以用这样的方式得到InputStream:
InputStream isImg = new FileInputStream("Image路径");


-----------------------------------------------------------------------
另外,decodeStream直接拿的图片来读取字节码了,
不会根据机器的各种分辨率来自动适应,
使用了decodeStream之后,需要在hdpi和mdpi,ldpi中配置相应的图片资源,
否则在不同分辨率机器上都是同样大小(像素点数量),显示出来的大小就不对了。

你可能感兴趣的:(Blog)