
方式:以R文件的方式
路径:假设 res/drawable下有 testjpg文件
Bitmap bitmap=BitmapFactorydecodeResource(thisgetContext()getResources(), Rdrawabletest)
三种方式:
现总结以下几种读取Bitmap的方法:
以文件流的方式,假设在sdcard下有 testpng
FileInputStream fis = new FileInputStream("/sdcard/testpng");
Bitmap bitmap = BitmapFactorydecodeStream(fis);
以R文件的方式,假设 res/drawable下有 testjpg文件
Bitmap bitmap = BitmapFactorydecodeResource(thisgetContext()getResources(), Rdrawabletest);
以ResourceStream的方式,但不用到R文件
Bitmapbitmap=BitmapFactorydecodeStream(getClassgetResourceAsStream(“/res/drawable/testpng”)
在 Java中,JavaVM拥有自动管理内存的功能,Java的GC能够进行垃圾回收,但是如果ImageView使用过多的Bitmap的话,经常会报OOM(内存溢出)。
造成内存溢出及解决方案:
使用BitmapFactorydecodeStream替代createBitmap方法
原因是该方法直读取字节,调用JNI>>nativeDecodeAsset()来完成decode,无需再使用java层的createBitmap。
使用压缩读取技术
BitmapFactoryOptions options = new BitmapFactoryOptions();
optionsinJustDecodeBounds = true;
BitmapFactorydecodeFile(imageSdUri, options);
final int height = optionsoutHeight;
final int width = optionsoutWidth;
optionsinSampleSize = 1;
int w = 320;
int h = 480;
h = wheight/width;//计算出宽高等比率
int a = optionsoutWidth/ w;
int b = optionsoutHeight / h;
optionsinSampleSize = Mathmax(a, b);
optionsinJustDecodeBounds = false;
Bitmap bitmap = BitmapFactorydecodeFile(imageSdUri, options);
3及时释放Bitamp
Bitmap对象在不使用时,我们应该先调用recycle()释放内存,然后才它设置为null虽然recycle()从源码上看,调用它应该能立即释放Bitmap的主要内存,但是测试结果显示它并没能立即释放内存。但是我它应该还是能大大的加速Bitmap的主要内存的释放。
如果不使用内存复用,这两个方法是一样的效果。
在通过复用 Bitmap 来解码时,那么 getByteCount() 表示新解码占用内存的大 小,getAllocationByteCount() 表示被复用 Bitmap真实占用的内存大小。
getByteCount()只是的大小
getAllocationByteCount()是Bitmap的大小
因为Bitmap可以复用,所以Bitmap可以放入不同的,当Bitmap放入更大的的时候,就会占用更大的内存,但是这个时候如果对Bitmap对象进行复用,放入一张小,并不会改变Bitmap的大小。
比如,最初Bitmap放入一张大小为4M的,这个时候Bitmap占用了4M的内存,然后当这张使用完成之后,对Bitmap进行复用,放入一张1M的,这个时候其实只是复用了Bitmap之前内存大小的四分之一,如果使用getByteCount(),得到的其实就是1M,但是这个时候Bitmap对象实际占用内存其实还是4M,虽然对Bitmap进行了复用,但是并不会因为放入的变小了而改变了原本Bitmap对象占用内存的大小,所以getAllocationByteCount()返回的是4M
以上就是关于Android如何读取资源文件里的图片到bitmap里面全部的内容,包括:Android如何读取资源文件里的图片到bitmap里面、android bitmap 从网络获取图片并处理问题 溢出、Android-Bitmap的getByteCount()和getAllocationByteCount()的区别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)