在我的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将释放该活动的所有引用。还要注意警报对话框

10-06 14:55