如何确保从Seap中清除Android位图

时间:2012-07-29 17:03:51

标签: android garbage-collection out-of-memory

我有一个使用相当大量位图的活动(activity1)。我还有另一个加载位图(activity2)的活动。在某些手机上运行时,我在activity2中收到OOM错误。我已经将错误跟踪到由activity1中的布局引起的。如果我取出activity1中的所有bitamps,并用只有十六进制颜色替换它们,那么我在activity2中没有得到OOM错误。

因此,我假设当调用activity1的onPause或onDestroy方法时,我在activity1中使用的位图不会从堆中删除。到目前为止,我已经尝试了here的答案,但我仍然得到了我的OOM错误。到目前为止,这是我的onPause和onResume方法。

@Override
protected void onPause() {
    mCache.onPause();
    mContext = null;

    mTimer.cancel();
    mTimer = null;

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

    super.onPause();
}

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 onResume() {
    super.onResume();
    setContentView(R.layout.homescreen);
    createButtons();
    mCache.onResume();
    performAnimation(false);

    mTimer = new Countdown();
    mTimer.start();
}

如何解决此问题的任何建议将不胜感激!感谢。

1 个答案:

答案 0 :(得分:0)

您可以对内存中加载的所有位图使用bitmap.recycle()方法,只要您确保在使用它们时再次加载它们。

根据文档,不应使用recycle()方法,因为尝试在Java中手动管理内存被视为不良做法。但是,如果您将此与我在System.gc()中看到的onPause()电话结合使用,理论上可以通过明确说明不需要的位图来加速有问题电话的GC过程。

我在您的代码段中没有看到任何位图代码,也许更多信息可以帮助澄清您的问题。