0

我在活动中遇到 OOM 错误问题。我有一个使用两个图像视图和大约 5 或 6 个按钮的布局。目前,我收到 OOM 错误,但注意到这些方法的改进。我使用这种方法在主屏幕中设置我的布局:

private void createButtons() 
{
    bitmaps = new ArrayList<Bitmap>();

    ImageView img = (ImageView)findViewById(R.id.homescreen_logo);
    Bitmap bmp = (Bitmap)BitmapFactory.decodeResource(getResources(), R.drawable.homescreen_logo);
    img.setImageBitmap(bmp);
    bitmaps.add(bmp);

    ImageView imge = (ImageView)findViewById(R.id.countdown_labels);
    Bitmap bitmp = (Bitmap)BitmapFactory.decodeResource(getResources(), R.drawable.homescreen_countdown_text);
    imge.setImageBitmap(bitmp);
    bitmaps.add(bitmp);
}

然后,在 onPause 方法中我调用这个方法:

private void recycleHomescreenImages() {
    for (Bitmap bmap : bitmaps) {
        bmap.recycle();
    }
    bitmaps = null;
}

虽然这确实在退出主屏幕活动时降低了我的堆使用量,但这还不够。由于我使用的其他视图不是 ImageViews,因此我不能采用仅使用 setImageBitmap() 方法的相同策略。关于如何强制为按钮收集背景的任何建议?这是我的一个按钮在 xml 中的样子。

<Button
  android:id="@+id/1_button"
  android:layout_width="294dp"
  android:layout_height="60dp"
  android:layout_alignParentTop="true"
  android:layout_centerHorizontal="true"
  android:layout_marginTop="33dp"
  android:background="@drawable/homescreen_button_1"
  android:onClick="onClick1"/>

谢谢你的帮助。

4

2 回答 2

1

我会建议延迟加载这些BitmapDrawable对象,例如尽可能晚地按需加载。此外,当您不再需要它们时,将对它们BitmapDrawable对象的引用设置为 null,并确保您没有对这些Bitmaps 和Drawables 的其他引用,以使它们有资格进行垃圾回收。请注意,您无法知道垃圾收集器何时启动,因此您可以这样做以节省内存。希望这会对您有所帮助。

于 2012-07-30T15:14:05.247 回答
0

实际上,我可以通过将此处的答案修改为如下所示来使其正常工作:

private void unbindDrawables(View view) {
    if (view.getBackground() != null) {
    view.getBackground().setCallback(null);
    view.setBackgroundDrawable(null);
    }
    if (view instanceof ViewGroup) {
        for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
        unbindDrawables(((ViewGroup) view).getChildAt(i));
        }
    ((ViewGroup) view).removeAllViews();
    }
}

编辑:谎言,我有时仍然会得到OOM。

于 2012-07-30T15:27:56.783 回答