在我的Android Studio项目中,我有一个活动(MainActivity
)和一个对象(PurchasesHandler
)。在活动的onCreate
方法中,PurchasesHandler的实例化如下:PurchasesHandler purchasesHandler = new PurchasesHandler(MainActivity.this, ...)
通过阅读许多有关内存泄漏的文章,我知道在通过一项活动时应该非常谨慎,因为这可能导致内存泄漏。但是我想通过活动不一定会导致内存泄漏,对吗?
因此,让我们进一步看一下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
中的另一个代码片段:public void sampleMethod() {
BillingClient billingClient = BillingClient.newBuilder(context)
.enablePendingPurchases()
.setListener(this) // Passes the onPurchasesUpdated listener of this class
.build();
在此代码段中,我将设置一个引用
PurchasesHandler
本身的侦听器(由于.setListener(this))。我的猜测是,由于侦听器持有对PurchasesHandler
的引用而PurchasesHandler
具有对活动的引用,因此存在内存泄漏。这意味着不能将活动从堆中释放/删除,对吗?如果我的假设是正确的,是否有什么好方法可以消除内存泄漏?我知道我应该取消注册监听器,但是对于
BillingClient
没有任何取消注册选项。仅endConnection()
方法,但是此方法有时无法正常工作。 最佳答案
如果任何引用活动的代码都可能导致内存泄漏,那么您是正确的。这就是为什么建议在活动停止时释放引用的原因。如果您的库不提供删除监听器功能,则将监听器对象设置为null将释放该活动的所有引用。还要注意警报对话框