EditText导致“活动”泄漏.目前的堆叠流回答没有帮助



我有一个代码,打开了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棒棒糖5.0(v21)上。它也在KitKat(v19)上泄漏。这不会发生在三星S7棉花糖和Nexus 6(牛轧糖)上。

这不会发生在Emulated Nexus 5棒棒糖5.0.2(v21)上。但发生在Emulated Nexus 5的v19上。

我检查了许多堆叠器流,但找不到解决方案。您将在https://medium.com/@elye.project/hell-level-4-未释放-by-android-strict-mode-dare-you-challenge-it-1dc9048bb4fb#.aiffbdikn

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

我认为这个问题与编辑文本无关,因为从严格模式日志SubActivity; instances=2; limit=1中可以清楚地看到,您有两个subActivity实例。之所以会出现这种情况,是因为在每次启动子活动时,您都要创建它的新实例,可以通过在启动子活动的同时使用启动模式标志singleInstancesingleTask来解决此问题。这保证了只能存在一个活动实例。

编辑1:

我仔细研究了你的代码,发现这个问题在Emulated Nexus 5的v19上是可以复制的。我很清楚,这个问题与编辑文本无关,因为即使子活动没有相关的视图,这个问题也是可复制的。正如Stack Oveflow帖子中所回答的,这可能是严格模式下的一个错误,因为该链接指出

如果"活动"已启动,并且很快退出并重新启动,则可以获得StrictMode.InstanceCountViolation.

然而,这仅仅是因为垃圾收集器还没有完成了活动的第一个实例,这意味着在内存中临时存在2个(或多个)实例。

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

并且从安卓DOcs

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

使用此代码完成SubActivity。

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

@Override
    public void onBackPressed() {
        super.onBackPressed();
        finish();
    }

相关内容

最新更新