Android setBackgroundResource 导致内存不足异常 [英] Android setBackgroundResource cause out of memory excepiton
问题描述
我正在开发一个在 ViewPager 中显示 12 个视图的游戏本应用程序.这是我的自定义 PagerAdapter :
I'm working on a gamebook application that shows 12 views in a ViewPager. This is my custom PagerAdapter :
private class ImagePagerAdapter extends PagerAdapter {
private int[] mImages = new int[] { R.drawable.copertinai,
R.drawable.blui, R.drawable.azzurroi, R.drawable.rossoi,
R.drawable.gialloi, R.drawable.verdei, R.drawable.rosai,
R.drawable.grigioi, R.drawable.neroi, R.drawable.arancionei,
R.drawable.marronei, R.drawable.violai, R.drawable.ulm };
@Override
public int getCount() {
return mImages.length;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == ((RelativeLayout) object);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Context context = MainActivity.this;
RelativeLayout relLayImageView = new RelativeLayout(context);
relLayImageView.setBackgroundResource(mImages[position]);
((ViewPager) container).addView(relLayImageView, new LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
return relLayImageView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
((ViewPager) container).removeView((RelativeLayout) object);
object=null;
System.gc();
}
}
在某些设备中,当这行代码被调用时,它会随机导致内存不足异常
In some devices it cause an out of memory exceptionr randomly when this line of code is called
relLayImageView.setBackgroundResource(mImages[position]);
但在所有设备中,当我翻页时,我会在 logcat 中看到类似的内容:
But in all devices I see something like this in the logcat when i turn pages:
12-31 00:25:31.655: I/dalvikvm-heap(9767): Grow heap (frag case) to 50.875MB for 10384016-byte allocation
当我在另一个 Activity 中根据用户操作为主布局设置不同的背景资源时,该应用程序也会因相同的问题在某些设备中崩溃.代码如下:
The app also crashes in some devices for the same problem when in another Activity I set different background resource to the main layout based on user action. Here the code:
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
colorButtons.get(indiceColoreAttuale).setBackgroundResource(
unSelectedColorsRes[indiceColoreAttuale]);
switch (index) {
case 0:
mainLayout.setBackgroundResource(R.drawable.blus);
break;
case 1:
mainLayout
.setBackgroundResource(R.drawable.azzurros);
break;
case 2:
mainLayout
.setBackgroundResource(R.drawable.rossos);
break;
case 3:
mainLayout
.setBackgroundResource(R.drawable.giallos);
break;
case 4:
mainLayout
.setBackgroundResource(R.drawable.verdes);
break;
case 5:
mainLayout
.setBackgroundResource(R.drawable.rosas);
break;
case 6:
mainLayout
.setBackgroundResource(R.drawable.grigios);
break;
case 7:
mainLayout
.setBackgroundResource(R.drawable.neros);
break;
case 8:
mainLayout
.setBackgroundResource(R.drawable.arancios);
break;
case 9:
mainLayout
.setBackgroundResource(R.drawable.marrones);
break;
case 10:
mainLayout
.setBackgroundResource(R.drawable.violas);
break;
}
mainLayout.startAnimation(animationShowTextColor);
mainLayout.setGravity(Gravity.CENTER_HORIZONTAL);
indiceColoreAttuale = index;
colorButtons.get(index).setBackgroundResource(
selectedColorsRes[index]);
}
});
当我在 mainLayout 上调用 setBackgroundResource() 时,它再次运行异常.
It runs excepiton again when I call setBackgroundResource() on mainLayout.
希望您能帮我解决这个问题,提前致谢!
I hope you can help me to solve this, thanks in advance!
推荐答案
我解决了!你所有的提示都很好,但真正的问题是/drawable"文件夹!我将所有图片都放在系统认为的/drawable"通用文件夹中,例如/drawable/mdpi",所以当我在具有 hdpi 或更多分辨率的设备中运行时,图像被调整大小,变得太大导致 OutOfMemoryException!
I solved! All your hints were good but the real problem was the "/drawable" folder! I had all the pictures in "/drawable" generic folder that is considered by the system like "/drawable/mdpi", so when I were running in devices with hdpi or more the images were resized, and became too big which cause OutOfMemoryException!
现在我使用/drawable-nodpi"来存储我的图像.此文件夹的工作方式类似于/drawable",但图像永远不会调整大小!
Now i'm using "/drawable-nodpi" to store my images. This folder works like "/drawable" but the images are never resized!
这篇关于Android setBackgroundResource 导致内存不足异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!