【问题标题】:TextView with id and textIsSelectable="true" causes leaking of the Activity object带有 id 和 textIsSelectable="true" 的 TextView 导致 Activity 对象泄漏
【发布时间】:2014-04-10 14:14:47
【问题描述】:

我花了三天时间来解决这个内存泄漏的问题,但我在任何地方都找不到其他人描述这个问题。这就是为什么我想问是否有人可以确认我没有错过什么。我还提交了错误报告,但我在这里询问 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 显示 Activity 在旋转后被销毁,但从未最终确定,导致多次旋转后出现 OutOfMemory 错误

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

感谢你们的cmets!

PS:我是新来的,无权添加新标签。有足够分数的人可以为这个问题添加一个“textisselectable”标签吗?谢谢

【问题讨论】:

    标签: android memory-leaks garbage-collection textview


    【解决方案1】:

    查看 Android 文档以了解有关 finalize 的用例。 Finalize 很昂贵,可能是导致内存泄漏的原因,而不是文本字段上的值。

    Android Object

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

    【讨论】:

    • 感谢您的回答。实际上,我通常根本不使用 finalize() 。我首先遇到了内存泄漏,并开始使用 finalize() 来缩小我的问题。这就是为什么我将第 (3.) 点标记为可选/方便,因为它只是很好地说明了问题,但即使根本不使用 finalize() 也会出现 OutOfMemory 错误。我应该更清楚地在我的问题中提到这一点。
    【解决方案2】:

    好的,我收到了对我的错误报告的答复,指出无法使用最新版本的 Android 复制它(我在两台运行 ICS 的设备上对其进行了测试)。所以我想我只需要相信他们,因为我没有任何更新的设备,而且它似乎也不会打扰任何人。毕竟这只是内存泄漏...... ;-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-26
      • 1970-01-01
      • 2021-08-11
      相关资源
      最近更新 更多