在内部班级改变方向时内存泄漏

时间:2011-05-02 10:20:15

标签: android

我的Activity的方向更改遇到内存泄漏问题。使用android工具和Memory Analysis Perspective(http://ttlnews.blogspot.com/2010/01/attacking-memory-problems-on-android.html),我终于发现了以下问题:

在方向更改期间,我将所需的数据保存到Inner类中,如下面的代码所示:

public class TestOrientation extends Activity {

    private ActivityData mData;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mylayout);
        ...
        mData = (ActivityData) getLastNonConfigurationInstance();
        ...
    }

    @Override
    public Object onRetainNonConfigurationInstance() {
        return new ActivityData(dataToSave1, dataToSave2);
    }

    private class ActivityData {

        public int mDataToSave1;
        public String mDataToSave2;

        public ActivityData(int dataToSave1, String dataToSave2) {
            mDataToSave1 = dataToSave1;
            mDataToSave2 = dataToSave2;
        }
    }
}

在内存内存分析透视图中,我可以看到属性mData保留对活动上下文的引用,因此它永远不会被释放。在一些方向改变后,我有一个递归参考:

sreenshot of MAP

要解决这个问题,我已将ActivityData声明为一个单独的文件,但如果有人能解释我为什么会遇到这个问题,我会很棒!

2 个答案:

答案 0 :(得分:5)

您应该使您的私有类(ActivityData)静态。内部非静态类保留其外部类的引用。

答案 1 :(得分:0)

让我们假设foo是你的第二个参数。

也许foo是你上下文中的一个String(比如someTextView.getText())?尝试传递foo.clone()或简单地传递新的String(foo);