finish()泄漏内存但onBackPressed()不是

时间:2017-02-24 00:04:55

标签: android memory out-of-memory activity-finish onbackpressed

我试图在一个应用程序中追踪内存泄漏,该应用程序已经在一些旧设备上发现了内存不足。我发现的其中一个漏洞真的让我失望了。我解决了泄漏,但我想知道是否有人对修复工作原理有任何了解。

泄漏的活动(让我们称之为活动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()本质上是相同的东西,但其中一个泄漏内存而另一个没有。有人知道为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

区别在于FragmentedActivity(即AppCompatActivity的父级)在onBackPressed中有以下代码:

public void onBackPressed() {
    if (!mFragments.popBackStackImmediate()) {
        finish();
    }
}

它没有finish()的任何具体实施。 所以看起来这样popBackStackImmediate会以某种方式影响你的流量。 我找到了OS 5.1.1 implementation

 @Override
 public boolean popBackStackImmediate() {
     checkStateLoss();
     executePendingTransactions();
     return popBackStackState(mActivity.mHandler, null, -1, 0);
 }

executePendingTransactions()可能是onBackPressed()finish()来电之间行为不同的原因。