Android finish()内存泄漏,但onBackPressed()不可用

Android finish()内存泄漏,但onBackPressed()不可用,android,memory,out-of-memory,activity-finish,onbackpressed,Android,Memory,Out Of Memory,Activity Finish,Onbackpressed,今天,我试图在一个应用程序中追踪内存泄漏,该应用程序在一些旧设备上内存不足。我发现的一个漏洞真让我抓狂。我解决了这个漏洞,但我想知道是否有人能洞察到为什么这个修复程序会起作用 正在泄漏的活动(我们称之为活动B)有一个图标,该图标是用户退出该活动的“x”。当按下x时,它调用finish(),然后返回活动A。此单击事件的代码如下: View ivExit = findViewById(R.id.imageview_exit); ivExit.setOnClickListener(ne

今天,我试图在一个应用程序中追踪内存泄漏,该应用程序在一些旧设备上内存不足。我发现的一个漏洞真让我抓狂。我解决了这个漏洞,但我想知道是否有人能洞察到为什么这个修复程序会起作用

正在泄漏的活动(我们称之为活动B)有一个图标,该图标是用户退出该活动的“x”。当按下x时,它调用finish(),然后返回活动A。此单击事件的代码如下:

    View ivExit = findViewById(R.id.imageview_exit);
    ivExit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (!isFinishing()) {
                finish();
            }
        }
    });
结果是,它将按预期工作,但内存泄漏。然而,通过一个简单的改变,我就能够在没有任何泄漏的情况下运行相同的精确测试。我所要做的就是将finish()更改为onBackPressed(),这样它就不再泄漏了。这对我来说很奇怪,因为我觉得onBackPressed()和finish()本质上是一样的,但是其中一个会泄漏内存,而另一个不会。有人知道为什么会这样吗

不同之处在于in(即的父级)在
on backpressed中有以下代码:

public void onBackPressed() {
    if (!mFragments.popBackStackImmediate()) {
        finish();
    }
}
对于
finish()
,它没有任何具体的实现。 看起来这
PopBackbackImmediate
在某种程度上影响了你的流量。 我发现
OS5.1.1


executePendingTransactions()
可能是
onBackPressed()
调用和
finish()
调用行为不同的原因。

onBackPressed()
在幕后处理一些用例,但稍后它还会隐式调用
finish()
。该设备上的操作系统版本是什么?这是AppCompatActivity吗?该设备是运行Android 6.0.1的Nexus 5X。是的,这个活动扩展了AppCompatActivity@j2ko。你问@j2ko很有趣,因为当我在另一台设备上测试时,它没有出现。这是非常有趣的,所以这个非常奇怪的差异只发生在Nexus?这绝对是有帮助的!我很好奇为什么它发生在Nexus而不是其他设备上。我会认为这是正确的,但我还是很好奇。
 @Override
 public boolean popBackStackImmediate() {
     checkStateLoss();
     executePendingTransactions();
     return popBackStackState(mActivity.mHandler, null, -1, 0);
 }