我试图在一个应用程序中追踪内存泄漏,该应用程序已经在一些旧设备上发现了内存不足。我发现的其中一个漏洞真的让我失望了。我解决了泄漏,但我想知道是否有人对修复工作原理有任何了解。
泄漏的活动(让我们称之为活动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()本质上是相同的东西,但其中一个泄漏内存而另一个没有。有人知道为什么会这样吗?
答案 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()
来电之间行为不同的原因。