当用户点击按钮时,我会在活动代码中继续切换这样的布局背景:
...
mylayout.setBackgroundDrawable(getResources().getDrawable(R.drawable.img1));//On First click
mylayout.setBackgroundDrawable(getResources().getDrawable(R.drawable.img2));//On Second Click
mylayout.setBackgroundDrawable(getResources().getDrawable(R.drawable.img10));//On 10th Click
...
mylayout.setBackgroundDrawable(getResources().getDrawable(R.drawable.img1));//On 11th Click 1st image again and so on.
我有10张图片,我一直在旋转 很快,它会导致OutOfMemory异常。我做错了什么?
如果在我的清单文件中有问题,我有:
android:minSdkVersion="11"
android:targetSdkVersion="17" />
编辑1
图像的平均大小为:50K
图像的平均尺寸为:600x450
所有图像img1,img2等都是jpeg图像
解决方案更新
将图像尺寸缩小到300x200解决了这个问题。这一次变化显着降低了内存需求。
答案 0 :(得分:1)
可能会发生这种情况,因为您的图片资源位于drawable
文件夹中;这相当于drawable-mdpi。您的设备可能不是mdpi
。
因此,要么提供您要支持的所有熨平板密度的图像。或者,将图像放在drawable-nodpi
中,这样您的图像就不会调整大小。因此没有OutOfMemoryException
。
答案 1 :(得分:0)
如果您可以使用位图更改Drawable,请使用Bitmap.recycle()。
希望这会有所帮助
答案 2 :(得分:0)
尺寸为600x450的每个位图在RAM中的大小为600 * 450 * 4 = 1 080 000字节(1 MB)。 您应该以另一种方式加载如此大的位图:
Bitmap bitmap = BitmapFactory.decodeResource(resources, R.drawable.img1);
myLayout.setBackgroundDrawable(new BitmapDrawable(resources, bitmap));
之前更改您必须执行的视图背景
Drawable background = myLayout.getBackground();
if (background != null && background instanceof BitmapDrawable) {
myLayout.setBackgroundDrawable(null);
BitmapDrawable bd = (BitmapDrawable) background;
bd.getBitmap().recycle();
}
答案 3 :(得分:0)
我不认为如此频繁地改变背景布局是一个很好的理想选择。我建议您使用RelativeLayout
作为第一项ImageView
。然后,每当您需要更改背景时,您都可以使用某些缓存的库更改ImageView
,例如:Universal Image Loader