具有 id 和 textIsSelectable="true" 的文本视图会导致活动对象泄漏



我花了三天时间才解决内存泄漏的问题,而且我在任何地方都找不到其他人描述这个问题。这就是为什么我想问是否有人能证实我没有错过什么。我也提交了一份错误报告,但我在SO上询问的原因(除了让其他人知道)是,我希望你让我知道其他视图及其属性会导致此类问题,这样我就可以避免它们。

我的问题如下:

(1.)创建一个简单的Android应用程序(例如SkeletonApp示例应用程序)

(2.)在onCreate()的末尾添加以下内容以引起内存分配:

Log.i(this.toString(), ">>> onCreate()");
auxList = new ArrayList<int[]>();
for(int i = 0; i < 20; i++) {
  auxList.add(new int[250000]);
}
Log.i(this.toString(), "<<< onCreate()");

(3.)(可选-只是为了方便)覆盖以下方法:

@Override
protected void onDestroy() {
  Log.i(this.toString(), ">>> onDestroy()");
  super.onDestroy();
}
@Override
protected void finalize() throws Throwable {
  Log.i(this.toString(), ">>> finalize() !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
  super.finalize();
}

(4.)运行应用程序并旋转屏幕几次(按左CTRL+F11)-现在一切都应该正常

(5.)在布局(skeleton_activity.xml)中添加:

<TextView
  android:id="@+id/textViewDebug"
  android:layout_width="30dp"
  android:layout_height="32dp"
  android:textIsSelectable="true"
/>

(6.)重复点(4.)-logCat显示"活动"在旋转后被破坏,但从未最终确定,导致多次旋转后出现OutOfMemory错误

(7.)删除textIsSelectable属性或将其设置为false以及删除id属性(即使保持textIsSelectable="true")可以防止出现问题。

谢谢你的评论!

附言:我是新来的,没有权利添加新标签。有足够分数的人能给这个问题加一个"textisselectable"标签吗?感谢

查看带有finalize的Android文档中的用例。Finalize代价高昂,可能是内存泄漏的原因,而不是文本字段的值。

Android对象

请注意,覆盖finalize的对象要比不覆盖finalized的对象昂贵得多。终结器可能会在对象不再可访问后运行很长一段时间,这取决于内存压力,因此依赖它们进行清理是个坏主意。还要注意,终结器在单个VM范围的终结器线程上运行,因此在终结器中进行阻塞工作是个坏主意。终结器通常只适用于具有本机对等体并且需要调用本机方法来销毁该对等体的类。即便如此,最好提供一个显式的关闭方法(并实现Closeable),并坚持调用方手动处理实例。这对文件之类的东西很有效,但对BigInteger之类的东西不太好,因为典型的调用代码必须处理大量临时代码。不幸的是,从单个终结器线程的角度来看,创建大量临时代码的代码是最糟糕的代码。

好的,我得到了我的错误报告的答案,说它不能用最新版本的Android复制(我在两台运行ICS的设备上测试了它)。所以我想我只能相信他们,因为我没有任何更新的设备,而且它似乎也不会困扰任何人。这毕竟只是内存泄漏…;-)

最新更新