Android 使用内部类更改方向时内存泄漏

Android 使用内部类更改方向时内存泄漏,android,Android,我在更改活动方向时遇到内存泄漏问题。通过android工具和内存分析透视图()我终于发现了以下问题: 在方向更改期间,我将需要的数据保存到一个内部类中,如您在以下代码中所看到的: public class TestOrientation extends Activity { private ActivityData mData; @Override public void onCreate(Bundle savedInstanceState) { su

我在更改活动方向时遇到内存泄漏问题。通过android工具和内存分析透视图()我终于发现了以下问题:

在方向更改期间,我将需要的数据保存到一个内部类中,如您在以下代码中所看到的:

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保留了对活动上下文的引用,因此它永远不会被释放。在几个方向改变之后,我有一个递归引用:


为了解决这个问题,我已经在一个单独的文件中声明了ActivityData,但是如果有人能解释我为什么会遇到这个问题,我将非常高兴

假设foo是您的第二个参数


可能foo是上下文中的字符串(例如someTextView.getText())?尝试传递foo.clone()或只传递新字符串(foo)

假设foo是您的第二个参数


可能foo是上下文中的字符串(例如someTextView.getText())?尝试传递foo.clone()或只传递新字符串(foo)

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

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

我不想将ActivityData类设置为静态类,但在阅读了您的文章后,我已经在Java文档和嵌套类页面()中看到了:“,与实例方法和变量一样,内部类与其封闭类的实例相关联…”这就是为什么它在我的活动中保留了一个参考。感谢将ActivityData设置为静态并没有什么害处,只是失去了对封闭类的访问权,您根本不需要它。我不想将ActivityData设置为静态,但在阅读了您的文章后,我已经在Java文档和嵌套类页()中:“与实例方法和变量一样,内部类与其封闭类的实例相关联…”这就是为什么它保留对我的活动的引用。感谢将ActivityData设置为静态并没有什么害处,只是失去了对封闭类的访问权,而你根本不需要它。