1

我有一个使用大量位图的活动 (activity1)。我还有另一个加载位图的活动(活动2)。在某些手机上运行时,我在 activity2 中收到 OOM 错误。我已经追踪到由activity1中的布局引起的错误。如果我取出活动 1 中的所有位放大器,并仅用十六进制颜色替换它们,那么活动 2 中不会出现 OOM 错误。

因此,我假设在调用 activity1 的 onPause 或 onDestroy 方法时,我在 activity1 中使用的位图没有从堆中删除。到目前为止,我已经从这里尝试了答案,但我仍然收到 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();
}

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

4

1 回答 1

0

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

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

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

于 2012-07-29T19:50:32.540 回答