在应用程序中,您可以在多个背景之间进行选择,每当我选择布局背景时,我都可以使用
进行设置relativeLayout.setBackground(getResources().getDrawable(R.drawable.background));
每个背景的分辨率为1440x2560像素,但每个背景只有12 KB左右,位深度为4。
问题在于,有时当我选择背景应用程序崩溃时出现错误java.lang.OutOfMemoryError
。
为什么会发生这种情况以及如何解决?
答案 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就是。
我仍在寻找干净的修复方法。