为啥 EditText 在 Ice Cream Sandwich 中保留其 Activity 的上下文

Posted

技术标签:

【中文标题】为啥 EditText 在 Ice Cream Sandwich 中保留其 Activity 的上下文【英文标题】:Why does EditText retain its Activity's Context in Ice Cream Sandwich为什么 EditText 在 Ice Cream Sandwich 中保留其 Activity 的上下文 【发布时间】:2012-01-19 20:13:49 【问题描述】:

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

LaunchActivity.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);

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

直到现在还没有解决这个问题。 (Android 4.2.1)

【讨论】:

【参考方案3】:

我花了几个小时才发现我受到了这个问题的影响。

问题似乎是由拼写检查器引起的。当我禁用 EditText 视图的建议时,所有内容都会被正确地收集起来。

mInputType = mText.getInputType();
mText.setInputType(mInputType | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);

我真的不想禁用它,因为许多用户想要拼写检查。所以,也许有一种方法可以在输入字段获得焦点时临时启用它。

如果您不需要拼写检查器,只需将其添加到布局 xml 中的 EditText 元素中即可:

android:inputType="textNoSuggestions"

这似乎也解决了它。

编辑:

刚刚发现这个似乎相关的线程:Work around SpellCheckerSession leak?

【讨论】:

【参考方案4】:

我也有同样的经历。我的 Gingerbread 设备都可以正常工作,但在我的 Galaxy Nexus 上测试这种情况是可以预见的。您的经历可能是 MR1 和 4.0.3 更新推出如此之快的原因。

【讨论】:

【参考方案5】:

您遇到了Android resources section on memory leaks 中描述的情况。有关一些解决方案,请参见该页面。

【讨论】:

【参考方案6】:

我遇到了同样的问题, 我通过隐藏对话框的 EditText ondismiss 来解决它。

  mEditText.setVisibility(View.GONE);

【讨论】:

以上是关于为啥 EditText 在 Ice Cream Sandwich 中保留其 Activity 的上下文的主要内容,如果未能解决你的问题,请参考以下文章

hdu 2121 Ice_cream’s world II

HDU2121 Ice_cream’s world II —— 最小树形图 + 超级点

HDU2121 Ice_cream’s world II

HDU - 2121 Ice_cream’s world II

hdu 2121 Ice_cream’s world II

HDU - 2121 Ice_cream’s world II 无根最小树形图