【发布时间】:2020-03-27 00:32:01
【问题描述】:
在我的 Android Studio 项目中,我有一个活动 (MainActivity) 和一个对象 (PurchasesHandler)。在活动的onCreate 方法中,PurchaseHandler 被实例化如下:
PurchasesHandler purchasesHandler = new PurchasesHandler(MainActivity.this, ...)
通过阅读大量有关内存泄漏的文章,我知道在传递活动时应该非常小心,因为这会导致内存泄漏。不过我猜通过activity不一定会导致内存泄漏吧?
所以让我们更进一步,看看PurchasesHandler。该处理程序包含一个简单的 AlertDialog 构建器,如下所示:
private void showBillingResponseDialog(String title, String message) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder
.setTitle(title)
.setMessage(message)
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
})
.show();
}
如您所见,我在此方法中引用了活动,但我想这也不会导致内存泄漏,对吧?如果是这样,有人可以解释为什么吗?我觉得它是这样的很直观,但我无法解释为什么会这样。
那么让我们再看一个来自PurchasesHandler的代码sn-p:
public void sampleMethod() {
BillingClient billingClient = BillingClient.newBuilder(context)
.enablePendingPurchases()
.setListener(this) // Passes the onPurchasesUpdated listener of this class
.build();
在这段代码 sn-p 中,我设置了一个引用 PurchasesHandler 本身的侦听器(因为 .setListener(this))。我现在的猜测是,存在内存泄漏,因为侦听器持有对PurchasesHandler 的引用,而PurchasesHandler 持有对活动的引用。这意味着不能从堆中释放/删除活动,对吗?
如果我的假设是正确的,有没有什么好的方法可以消除内存泄漏?我知道我应该注销监听器,但是对于BillingClient,不存在注销选项。只有一个endConnection() 方法,但是这种方法有时不能正常工作。
【问题讨论】:
标签: java android android-studio memory-leaks