2

我有一个开启 Android 严格模式、VmPolicy detectAll 和 Penalty Death 的代码。这在应用程序中打开。

所以它可以帮助我检测内存泄漏。我的代码很简单,2 个活动(几乎是空白)。MainActivity 有一个按钮单击以打开 SubActivity。SubActivity 只有一个 EditText。

代码可以在这里获取https://github.com/elye/issue_edittextleak

如果您运行代码,从 MainActivity 转到 SubActivity,然后返回 MainActivity(使用 Back Key),然后转到 SubActivity,然后返回......它会崩溃

E/StrictMode: class com.elyeproj.edittextleak.SubActivity; instances=2; limit=1
android.os.StrictMode$InstanceCountViolation: class com.elyeproj.edittextleak.SubActivity; instances=2; limit=1
at android.os.StrictMode.setClassInstanceLimit(StrictMode.java:1)

这是因为它检测到 SubActivity 已经泄露。

为什么 SubActivity 泄露,因为它有 EditText。删除它会导致它不再泄漏。

这发生在三星 S5 Lollipop 5.0 (v21) 上。它还在 KitKat (v19) 上泄漏。它不会发生在三星 S7 Marshmallow 和 Nexus 6 (Nougat) 上。

Emulated Nexus 5 Lollipop 5.0.2 (v21) 不会发生这种情况。但是发生在 Emulated Nexus 5 的 v19 上。

我检查了许多stackoverflow,但找不到解决方案。您将在https://medium.com/@elye.project/hell-level-4-unleashed-by-android-strict-mode-dare-you-challenge-it中阅读有关此问题的更多详细信息以及我的探索-1dc9048bb4fb#.aiffbdikn

那我想要什么? 我认为 Lollipop 5.0.2 及更高版本上的内存泄漏已得到解决。但是对于之前的版本,我如何在可以拥有editText的同时防止泄漏?

4

2 回答 2

3

我认为这个问题与编辑文本无关,因为从严格模式日志SubActivity; instances=2; limit=1中很明显你有两个 subActivity 实例。发生这种情况是因为在每次启动 subActivity 时,您都在创建它的一个新实例,这个问题可以通过使用启动模式标志singleInstancesingleTask在启动 subActivity 时解决。这保证了只能存在一个活动实例。

编辑1:

我玩弄了你的代码,发现这个问题在 Emulated Nexus 5 的 v19 上是可重现的。我很清楚这个问题与编辑文本无关,因为即使 subActivity 没有与之关联的视图,这个问题也是可重现的它。正如此Stack Oveflow帖子中所回答的那样,这可能是严格模式下的错误,因为该链接指出

如果一个 Activity 被启动,并很快退出并重新启动,你可以得到一个 StrictMode.InstanceCountViolation。

然而,这仅仅是因为垃圾收集器尚未完成 Activity 的第一个实例,这意味着内存中暂时有 2 个(或更多)实例。

在 startActivity() 或 startActivityForResult() 之前调用 System.gc() 将停止 StrictMode.InstanceCountViolation

并来自 android DOcs

不要觉得有必要修复 StrictMode 找到的所有内容。特别是,在正常的活动生命周期中,许多磁盘访问情况通常是必要的。使用 StrictMode 查找您不小心做的事情。不过,UI 线程上的网络请求几乎总是一个问题。

于 2016-07-30T06:22:20.407 回答
0

使用此代码完成 SubActivity 。

将此代码添加到子活动类文件中。

@Override
    public void onBackPressed() {
        super.onBackPressed();
        finish();
    }
于 2016-07-30T06:17:10.103 回答