`
gnibrE
  • 浏览: 136561 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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中配置相应的图片资源,
否则在不同分辨率机器上都是同样大小(像素点数量),显示出来的大小就不对了。
分享到:
评论
1 楼 yangzhaoze 2011-03-31  
得到bitmap之后人,如何放入到imageview中,还是要用setImag。。。。这些方法啊

相关推荐

Global site tag (gtag.js) - Google Analytics