В биллинге приложения BroadcastReceiver Утечка памяти - PullRequest
3 голосов
/ 15 марта 2019

Я открываю Активность с ActivityResult и после успешной покупки товара закрываю текущую активность, которая удерживает процесс покупки, и отправляю данные обратно. Но Leak Canary отлавливает утечку памяти о BillingBroadcastReceiver. Я инициализирую клиент биллинга OnCreate и выпускаю onDestroy.

Вот мой метод init, который вызывается в OnCreate

billingClient = BillingClient.newBuilder(this).setListener(this).build();
        billingClient.startConnection(new BillingClientStateListener() {
            @Override
            public void onBillingSetupFinished(int responseCode) {

                if (responseCode == BillingClient.BillingResponse.OK) {
                    // The billing client is ready. You can query purchases here.
                    loadProducts();
                } else {
                    // Error
                }

            }

            @Override
            public void onBillingServiceDisconnected() {
                // Try to restart the connection on the next request to
                Timber.d("Connection Error");
            }
        });

Загрузить информацию о продукте, когда billingClient готов

private void loadProducts() {

if (billingClient.isReady()) {

    List<String> skuList = new ArrayList<>(getViewModel().getSkuIdList());
    SkuDetailsParams params = SkuDetailsParams.newBuilder().setSkusList(skuList).setType(BillingClient.SkuType.INAPP).build();

    billingClient.querySkuDetailsAsync(params, new SkuDetailsResponseListener() {
        @Override
        public void onSkuDetailsResponse(int responseCode, List<SkuDetails> skuDetailsList) {

            if (responseCode == BillingClient.BillingResponse.OK) {
                Timber.d("SkuList --> %s", skuDetailsList.size());

            } else {
                Timber.d("Can't querySkuDetailsAsync, responseCode: %s", responseCode);
            }

        }
    });

} else {
    Timber.d("Billing Client not Ready");
}
}

Вот мой метод освобождения, который вызывается в OnDestroy

    if (billingClient != null && billingClient.isReady()) {
        billingClient.endConnection();
        billingClient = null;
    }

OnPurchaseUpdated Я позвонил в службу поддержки и закрыл это действие в зависимости от результата обслуживания.

public void onPurchasesUpdated(int responseCode, @Nullable List<Purchase> purchases) {

    if (responseCode == BillingClient.BillingResponse.OK && purchases != null) { 
        for (Purchase purchase : purchases) {
            billingClient.consumeAsync(purchase.getPurchaseToken(), new ConsumeResponseListener() {
                @Override
                public void onConsumeResponse(int responseCode, String purchaseToken) {
                    if (responseCode == BillingClient.BillingResponse.OK && purchaseToken != null) {
                        Timber.d("onConsumeResponse --> %s", purchaseToken);
                        getViewModel().informPurchase(necessary data);
                    }
                }
            });
        }
    } else if (responseCode == BillingClient.BillingResponse.USER_CANCELED) {
        // Handle an error caused by a user canceling the purchase flow.
        Timber.d("Billing Cancelled");

    } else {
        Timber.d("An Error Occured");
    }
}

Я использую последнюю библиотеку для покупки в приложении

implementation 'com.android.billingclient:billing:1.2.1'

После успешной покупки предмета и закрытия недавней активности Leak Canary показывает мне эту ошибку. Как я могу избежать этой утечки памяти?

BroadcastError

1 Ответ

1 голос
/ 20 марта 2019

Действие уничтожается до того, как billingClient будет готово, поэтому billingClient.isReady будет ложным, а endConnection никогда не будет вызываться, поэтому ссылка на Действие (Действие является слушателем BillingClient) выиграла 'его можно удалить, и у вас будет утечка.

Чтобы исправить, просто выполните:

if (billingClient != null) {
        billingClient.endConnection();
        billingClient = null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...