Bitmap使用后未调用recycle()
public static void recycleBitmap(Bitmap bitmap)
{
if(null!=bitmap&&!bitmap.isRecycled())
{
bitmap.recycle();
}
bitmap=null;
}
除此之外,其他的一些图片的优化方案:
第一、及时的销毁。
虽然,系统能够确认Bitmap分配的内存最终会被销毁,但是由于它占用的内存过多,所以很可能会超过java堆的限制。因此,在用完Bitmap时,要及时的recycle掉。recycle并不能确定立即
就会将Bitmap释放掉,但是会给虚拟机一个暗示:“该图片可以释放了”。
第二、设置一定的采样率。
有时候,我们要显示的区域很小,没有必要将整个图片都加载出来,而只需要记载一个缩小过的图片,这时候可以设置一定的采样率,那么就可以大大减小占用的内存。如下面的代码:
采样率方法一,简单设置为2:
BitmapFactory.Options newOpts= new BitmapFactory.Options();
newOpts.inSampleSize = 2;//图片宽高都为原来的二分之一,即图片为原来的四分之一
Bitmap bitmap =BitmapFactory.decodeFile(srcImgPath, newOpts);
采样率方法二,循环原来的二倍:
Bitmap bm=null;
BitmapFactory.Options newOpts = new BitmapFactory.Options();
while(bm==null)
{
try {
bm = BitmapFactory.decodeFile(srcImgPath, newOpts);
break;
catch (OutOfMemoryError e)
{
e.printStackTrace();
}
newOpts.inSampleSize*=2;
}
采样率方法三,循环直到不会抛出OutOfMemoryError:
Bitmap bm=null;
BitmapFactory.Options newOpts = new BitmapFactory.Options();
while(bm==null)
{
try {
bm = BitmapFactory.decodeFile(srcImgPath, newOpts);
break;
catch (OutOfMemoryError e)
{
e.printStackTrace();
}
newOpts.inSampleSize++;
}
采样率方法四,根据图片文件大小阀值,比如100K:
newOpts.inSampleSize=(int) Math.ceil(Math.sqrt(fileLength/100*1024));
采样率方法五,根据图片文件宽度和高度
int standardImgWidth=640;
int standardImgHeight=640;
int widthRation=width/standardImgWidth;
int heightRation=height/standardImgHeight;
newOpts.inSampleSize=(widthRation>heightRation)?heightRation:widthRation;
采样率方法六,根据图片文件大小阀值/图片文件宽度和高度
rationSize=方法四获取的inSampleSize;
rationDimens=方法五获取的inSampleSize;
newOpts.inSampleSize=Math.min(rationSize, rationDimens);
第三、巧妙的运用软引用(SoftRefrence)
有些时候,我们使用Bitmap后没有保留对它的引用,因此就无法调用Recycle函数。这时候巧妙的运用软引用,可以使Bitmap在内存快不足时得到有效的释放。
邮箱:zz7zz7zz@163.com
微博:http://weibo.com/u/3209971935