java.lang.OutOfMemoryError用于小图片

时间:2015-02-14 17:01:52

标签: android

在应用程序中,您可以在多个背景之间进行选择,每当我选择布局背景时,我都可以使用

进行设置
relativeLayout.setBackground(getResources().getDrawable(R.drawable.background));

每个背景的分辨率为1440x2560像素,但每个背景只有12 KB左右,位深度为4。

问题在于,有时当我选择背景应用程序崩溃时出现错误java.lang.OutOfMemoryError

为什么会发生这种情况以及如何解决?

3 个答案:

答案 0 :(得分:0)

加载前调整图像大小

 public Bitmap resizeBitmap(int targetW, int targetH) {
    BitmapFactory.Options bmOptions = new BitmapFactory.Options();
    bmOptions.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(photoPath, bmOptions);
    int photoW = bmOptions.outWidth;
    int photoH = bmOptions.outHeight; 
    int scaleFactor = 1;
    if ((targetW > 0) || (targetH > 0)) { 
        scaleFactor = Math.min(photoW/targetW, photoH/targetH); 
    }
    bmOptions.inJustDecodeBounds = false;
    bmOptions.inSampleSize = scaleFactor;
    bmOptions.inPurgeable = true;

    return BitmapFactory.decodeFile(photoPath, bmOptions);
}

答案 1 :(得分:0)

问题很简单。每次更改位图时都需要通过单击按钮来回收位图,否则它将保留在内存中并最终导致内存不足异常。

无论如何,如果你想解决这个问题,请在活动中保留对你的位图的引用。

私人位图currentBitmap;

public void changeBitmap(Bitmap bitmap){
  relativeLayout.setBackgroundImage(bitmap);
  if(currentBitmap != null){    
  /*this is where the magic happens, you                
  recycle your old bitmap whose reference you had stored in the global 
  variable*/
    currentBitmap.recycle();
  }
  currentBitmap = bitmap;
}

答案 2 :(得分:-2)

android:largeHeap="true"中的AndroidManifest中的quckfix为<application> 但我认为它需要大量的RAM才能在屏幕上显示Drawable。当你以编程方式调用垃圾收集器时,Dirty Fix就是。

我仍在寻找干净的修复方法。