gpt4 book ai didi

java - 什么时候将 Activity 传递给另一个类会导致内存泄漏?

转载 作者:行者123 更新时间:2023-12-01 19:44:37 25 4
gpt4 key购买 nike

在我的 Android Studio 项目中,我有一个 acitivty ( MainActivity ) 和一个对象 ( PurchasesHandler )。里面onCreate Activity 的方法中,PurchasesHandler 被实例化,如下所示:

PurchasesHandler purchasesHandler = new PurchasesHandler(MainActivity.this, ...)

通过阅读大量有关内存泄漏的文章,我知道在传递 Activity 时应该非常小心,因为这可能会导致内存泄漏。但我猜传递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();
}

正如你所看到的,我在这个方法中引用了activity,但我想这也不会导致内存泄漏,对吧?如果是这样,有人可以解释为什么吗?我觉得很直观,就是这样,但我无法解释为什么会这样。

让我们看一下 PurchasesHandler 中的另一个代码 fragment :

public void sampleMethod() {
BillingClient billingClient = BillingClient.newBuilder(context)
.enablePendingPurchases()
.setListener(this) // Passes the onPurchasesUpdated listener of this class
.build();

在此代码 fragment 中,我设置了一个引用 PurchasesHandler 的监听器。本身(因为 .setListener(this))。我现在的猜测是,存在内存泄漏,因为监听器持有对 PurchasesHandler 的引用。和 PurchasesHandler保存对 Activity 的引用。这意味着该 Activity 无法从堆中释放/删除,对吗?

如果我的假设是正确的,有什么好的方法可以消除内存泄漏吗?我知道我应该取消注册监听器,但是对于 BillingClient不存在取消注册选项。只有一个endConnection()方法,但是这个方法有时不能正常工作。

最佳答案

如果任何保留对 Activity 的引用的代码可能导致内存泄漏,那么您是正确的。这就是为什么建议在 Activity 停止时释放引用。如果您的库不提供删除监听器功能,则将监听器对象设置为 null 将释放该 Activity 的所有引用。还要注意警报对话框

关于java - 什么时候将 Activity 传递给另一个类会导致内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59138179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com