无法在VM预算中删除可绘制的崩溃

时间:2012-04-24 14:40:10

标签: android imageview android-linearlayout

我正在开发一个使用某种本地背景的应用。这个想法是为了让这个变得更好。我设法使用此代码更改“背景”。

Bitmap bMap = BitmapFactory.decodeFile(sharedPreferences.getString("PICTURE", ""));
        Drawable d =new BitmapDrawable(bMap);
        bac.setBackgroundDrawable(d);
        } 

问题是每次我返回“背景屏幕”时,应用程序因OutOfMemoryError而崩溃。然后它显示了新的背景。我需要某种代码,使应用程序不会崩溃。我在ImageView中管理这个,但在LinearLayout中没有。对于ImageView,我使用以下代码:

Bitmap bMap = BitmapFactory.decodeFile(sharedPreferences.getString("PICTURE", ""));
    image.setImageBitmap(bMap);

并避免崩溃:

@Override
protected void onPause() {
super.onPause();

unbindDrawables(findViewById(R.id.iv_pic));
System.gc();

}

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

unbindDrawables(findViewById(R.id.iv_pic));
System.gc();

}

我如何为LinearLayout做同样的事情?

1 个答案:

答案 0 :(得分:0)

关于OOM异常以及如何处理它,有很多问题。在发布问题之前请search the forum

一些注意事项:

  1. 您可以使用Bitmap方法释放recycle消耗的内存(在您的代码中,您可以调用bMap.recycle()
  2. 您可以使用LinearLayout检索对findViewById的引用,并将其传递给unbindDrawables,如unbindDrawables(findViewById(R.id.myLinearLayoutId));