android - 为什么 EditText 在 Ice Cream Sandwich 中保留其 Activity 的上下文

标签 android memory-leaks android-4.0-ice-cream-sandwich

在 Ice Cream Sandwich 中,当有一个包含 EditText 的 Activity 时,即使在用户离开 Activity 之后,EditText 也会保留 Activity 的 Context。为了证明这一点,我创建了 TestLeakActivity,它分配了一个大字节数组。由于 Activity 的 Context 永远不会被垃圾回收,因此字节数组会在堆上累积,最终导致 OutOfMemoryError。您可以使用 DDMS 堆工具观察堆增长,并且可以通过查看 Eclipse MAT 中的 HPROF 文件来跟踪对 EditText 类的未完成引用。要创建内存泄漏,请进入 LaunchActivity,然后继续启动并退出 TestLeakActivity。

LaunchActivity.java
package com.example.testleakproject;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

public class LaunchActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Button button = new Button(this);
        button.setText("Start TestLeakActivity");
        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(LaunchActivity.this, TestLeakActivity.class);
                startActivity(intent);
            }
        });

        ViewGroup container = ((ViewGroup) findViewById(android.R.id.content));
        container.addView(button);
    }
}
TestLeakActivity.java
package com.example.testleakproject;

import android.app.Activity;
import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.EditText;

public class TestLeakActivity extends Activity {
    private byte[] mSomeBytes = new byte[1048576];

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        EditText editText = new EditText(this);
        editText.setHint("TestLeakActivity");

        ViewGroup container = ((ViewGroup) findViewById(android.R.id.content));
        container.addView(editText);
    }
}

最佳答案

这是一个已知错误,将在 ICS MR1 中修复。

关于android - 为什么 EditText 在 Ice Cream Sandwich 中保留其 Activity 的上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8497965/

相关文章:

java - 启动一个基于字符串的 Intent

android - 如何从 Android 中的 NoHttpResponseException 获取 Http 状态代码?

javascript - $.cache 什么时候被认为太大了?

android - 编写向后兼容的 ICS Android 应用程序

java - 只会读取和写入一行

java - Android:如何从 URL 播放 mp4 视频?

debugging - 为什么在 GHC 中直接导入的函数与我使用从 GHC 库中复制的源代码编写的函数大不相同

c++ - 视觉检漏仪不起作用

Android:使用 API 级别 11(或更高)的 Youtube API

android - ListFragment onListItemClick 不再适用于 Android 4.1 Jelly Bean