-
-3 16
-
在android中,虚拟机会为每个要运行的应用程序开启4.734MB的堆大小,我们存进程序里面的是png或者是jpg等图片,这种压缩的图片,当我们在程序中使用bitmap来创建位图,会使图片增大,大概有两倍的大小,如果这时候我们放入多张图片,就很大的可能会使内存溢出,从而产生oom的现象。
//定义堆大小//增强程序堆内存的处理效率private final static float TARGET_HEAP_UTILIZATION = 0.75f;//强制分配大内存,增强程序堆内存的处理效率VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION);//内存回收if(!Currentimage.isRecycled() ){Currentimage.recycle(); //回收图片所占的内存System.gc(); //提醒系统及时回收}尽量不要使用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中配置相应的图片资源,
否则在不同分辨率机器上都是同样大小(像素点数量),显示出来的大小就不对了。
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
- 评论(0)
发表评论 TrackBack