如何从内存中清除动态创建的视图?

时间:2012-03-30 19:06:26

标签: android memory view clear

我正试图从记忆中清除一些观点。

这是情况。 我有一个活动,我称之为A和另一个B.

现在我按下活动A中的一个按钮,该按钮调用活动B,动态创建大量视图 在此之后,我按回按钮返回活动A. 多次重复这两步。

结果是,在DDMS中,对象和内存的数量分配的静止图像增长(对象数量增加了88,分配了0,002MB) 这意味着不要从内存中删除视图!

如何从内存中完全清除视图?

Thx!

更新 - 在这里,您可以获得一些新信息

基本上,在我的“真实世界”中,我只创建了一个很多次的Activity。发生这种情况是因为我必须与Web服务进行通信,并且所有响应都是在此活动的新实例中创建的。

我尝试使用下面的代码解决此问题

@Override
protected void onDestroy() {
    super.onDestroy();      
    nullViewDrawablesRecursive(mRootView);
    mRootView = null;
    System.gc();
}

那是我的nullViewDrawablesRecursive

private void nullViewDrawablesRecursive(View view) {
    if (view != null) {
        try {
            ViewGroup viewGroup = (ViewGroup) view;


            int childCount = viewGroup.getChildCount();
            for (int index = 0; index < childCount; index++) {
                View child = viewGroup.getChildAt(index);
                nullViewDrawablesRecursive(child);
            }
        } catch (Exception e) {
        }

        nullViewDrawable(view);
    }
}

那是我的nullViewDrawable

private void nullViewDrawable(View view) {
    try {
        view.setBackgroundDrawable(null);
    } catch (Exception e) {
    }

    try {
        ImageView imageView = (ImageView) view;
        imageView.setImageDrawable(null);
        imageView.setBackgroundDrawable(null);
    } catch (Exception e) {
    }
}

基本上我想在销毁活动之前从其父级(mRootView)中删除所有视图和子级。它工作得很好,如果我不这样做,对象和内存使用量会越来越多。

关键是,它并不完美,显然某些类型的观点不会被破坏。而且我认为我正在“重新发明轮子”,似乎很难做到一件简单的事情!

再次,非常感谢您帮助我!

2 个答案:

答案 0 :(得分:2)

通常,您无需担心从内存中清除视图。您可以让虚拟机和Android框架在必要时处理此问题。但是,您确实需要关注内存泄漏。如果您的活动正在共享/保持对视图的引用,并且它们不能被垃圾收集,则这是一个问题。您可以从这里开始阅读:http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html

虽然没有看到你的代码,但很难提供一些更具体的建议......

答案 1 :(得分:1)

在onDestroy()中,将视图设置为null并调用垃圾收集器。

@Override
public void onDestroy() {
    super.onDestroy();
    myView = null;
    System.gc();
}

这可以通过调用System.gc()来帮助垃圾收集器,但不能保证内存被清除。但是,只要你没有泄漏,就不会有问题。