在 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/