现在的位置: 首页 > 移动开发 > 正文

android 内存泄露那些事情之Bitmap(二)

2019年09月14日 移动开发 ⁄ 共 1908字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.