在 Ice Cream Sandwich 中,当有一个包含 EditText 的 Activity 时,即使在用户离开 Activity 之后,EditText 也会保留 Activity 的 Context。为了证明这一点,我创建了 TestLeakActivity,它分配了一个大字节数组。由于 Activity 的 Context 永远不会被垃圾回收,因此字节数组会在堆上累积,最终导致 OutOfMemoryError。您可以使用 DDMS 堆工具观察堆增长,并且可以通过查看 Eclipse MAT 中的 HPROF 文件来跟踪对 EditText 类的未完成引用。要创建内存泄漏,请进入 LaunchActivity,然后继续启动并退出 TestLeakActivity。
启动活动.java
包 com.example.testleakproject; 导入android.app.Activity; 导入android.content.Intent; 导入android.os.Bundle; 导入android.view.View; 导入 android.view.View.OnClickListener; 导入android.view.ViewGroup; 导入android.widget.Button; 导入 android.widget.TextView; 公共类 LaunchActivity 扩展 Activity { @覆盖 公共无效 onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); 按钮按钮 = 新按钮(此); button.setText("开始 TestLeakActivity"); button.setOnClickListener(new OnClickListener() { @覆盖 公共无效 onClick(查看 v){ Intent intent = new Intent(LaunchActivity.this, TestLeakActivity.class); 开始活动(意图); } }); ViewGroup 容器 = ((ViewGroup) findViewById(android.R.id.content)); 容器.addView(按钮); } }
TestLeakActivity.java
包 com.example.testleakproject; 导入android.app.Activity; 导入android.os.Bundle; 导入android.view.ViewGroup; 导入 android.widget.EditText; 公共类 TestLeakActivity 扩展 Activity { 私有字节[] mSomeBytes = 新字节[1048576]; @覆盖 公共无效 onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); EditText editText = new EditText(this); editText.setHint("TestLeakActivity"); ViewGroup 容器 = ((ViewGroup) findViewById(android.R.id.content)); 容器.addView(editText); } }