Android Bitmap位图
1. Bitmap 对象只能通过BitmapFactory创建,BitmapFactory提供了静态方法decodeXXXXX(****)方法分别将五种资源加载成Bitmap对象中。
2. BitmapFactory生成Bitmap对象是调用底层的JNI接口,所以在加载Bitmap图片这个过程中会包含两部分的内存区域,Java部分和C部分。 Java部分的会通过系统的垃圾回收机制自动回收,但是C部分的就不能自动回收了,所以Bitmap使用结束要调用recycle()方法释放C部分的内存。recycle()也是调用JNI接口实现。
3. 读取Bitmap位图时,Android系统分配给虚拟机中的堆大小只有8M,所以Bitmap对象用完一定的及时回收。
// 释放bitmap图片
if (bitmap != null && bitmap.isRecycled()) {
// 释放C部分占用的内存
bitmap.recycle();
// 加快Java部分的内存回收
bitmap = null;
}
// 加快Java回收机制对Java部分中垃圾的回收,不一定马上回收,根据回收算法决定
System.gc();
4. Android 3.0后对Bitmap图片加载又对图片大小有限制了,主要是是硬件加速器对图片大小的限制,如果加载图片大于了这个限制就不能加载,提示Bitmap too large to be uploaded into a texture exception。这个限制不同的机子不一样,据说最小的是2048 * 2048。现在有一个粗暴的解决办法:<application android:hardwareAccelerated="false" ...> 关掉硬件加速器,但我个人认为这样不太好,如果有更好的解决方案的请留言。