如何在打开新活动时清除先前活动的位图内存

时间:2014-10-31 08:47:07

标签: android performance

我的应用程序有大量的位图。我已尝试过Android Dev培训的所有内容,但我的应用仍然有OOM errors

我的activity A有一个列表视图,其中包含图像列表。点击它后会打开一个新的activity B

Activity B包含该图片的详细信息和推荐图片列表。当点击下面的列表时,它会打开新的活动,依此类推......

我尽一切努力减少内存,但在打开6 - 8活动后应用程序崩溃。那么任何人都可以帮助我在打开新活动时如何清除之前活动的位图内存?

抱歉我的英文不好

2 个答案:

答案 0 :(得分:4)

您可以在bitmap.recycle()中使用onDestroy()

您也可以在onDestroy()中使用此代码以避免OOMExceptions。这基本上解除了活动中所有图像的绑定:

public void unbindDrawables(View view) {//pass your parent view here
        try {
            if (view.getBackground() != null)
                view.getBackground().setCallback(null);

            if (view instanceof ImageView) {
                ImageView imageView = (ImageView) view;
                imageView.setImageBitmap(null);
            } else if (view instanceof ViewGroup) {
                ViewGroup viewGroup = (ViewGroup) view;
                for (int i = 0; i < viewGroup.getChildCount(); i++)
                    unbindDrawables(viewGroup.getChildAt(i));

                if (!(view instanceof AdapterView))
                    viewGroup.removeAllViews();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

答案 1 :(得分:0)

我假设您的清单中的活动没有任何特殊标志,因此它始终会打开一个新实例。

您可以在活动中使用android:launchMode="singleTask"以确保仅加载一次。但是我认为在你的情况下,最好使用片段并仅保留对图像的引用一次。

通常,当您没有释放对图像的引用时,您会得到OOM errors。 如果没有看到处理图像的代码,很难提供更多细节。