Использование queryPurchases в AysncTask путем передачи клиента биллинга в этот класс - без возврата ожидаемого результата - PullRequest
0 голосов
/ 10 июля 2019

Я внедряю биллинг в приложении. Я могу делать все, что хочу, пока не проверю предыдущие покупки пользователей. В своем первом упражнении в onCreate я создаю экземпляр моего класса BillingManger, который обрабатывает все платежи в приложении.

Затем я вызываю getPurchases для получения объекта PurchaseResult в последующем в методах onCreate (& onResume):

    //Creating instance....
    billingManager = new BillingManager(this, this.snackCoordinatorLayout);

    //Checking purchases....
    billingManager.getPurchases(this);

Метод getPurchases создает экземпляр класса, который расширяет AsyncTask для асинхронного запроса покупок. Требуется прослушиватель для обратного вызова и переменная-член BillingClient (именно здесь я думаю, что я могу ошибаться - объяснили почему в конце.):

 //Querying purchases with AsyncTask
void getPurchases(PurchaseAsyncResponse listener) {


    CheckPurchasesAsync check = new CheckPurchasesAsync(listener, this.mBillingClient);
    check.execute();

}

Вот класс AsyncTask. Это возвращает BuyResult через обратный вызов интерфейса, который он успешно делает.

public class CheckPurchasesAsync extends AsyncTask<Void, Void, Purchase.PurchasesResult> {

private PurchaseAsyncResponse listener;
private BillingClient mBillingClient;

CheckPurchasesAsync(PurchaseAsyncResponse listener, BillingClient billingClient) {
    this.listener = listener;
    this.mBillingClient = billingClient;
}

@Override
protected Purchase.PurchasesResult doInBackground(Void... voids) {
    return mBillingClient.queryPurchases(BillingClient.SkuType.INAPP);
}


@Override
protected void onPostExecute(Purchase.PurchasesResult purchasesResult) {
    listener.purchaseAsyncResponse(purchasesResult);

}

Теперь в режиме обратного вызова я выпускаю что-то не работает, как я хотел.

@Override
public void purchaseAsyncResponse(Purchase.PurchasesResult purchase) {

    if (purchase.getPurchasesList() != null) {
        getMessage("mPurchaes NotNull");
        //Only need to get the first element - element 0 because their is only one product for now.
        if (purchase.getPurchasesList().get(0).getPurchaseState() == Purchase.PurchaseState.PURCHASED) {
            getMessage("Unlocking everything");
            unlockEveryThing();

        }
    } else {
        getMessage("mPurchases Null ASYNC");
    }

}

purchase.getPurchasesList() - это ноль, когда этого не должно быть, поэтому я получаю сообщение-закуску, вызываемое в результирующем операторе else.

В рамках отладки я вызвал queryPurchase в другом методе. У меня есть кнопка, с помощью которой пользователь может впервые приобрести премиум-функции (то есть предполагается, что они исчезнут, если у меня не возникнет проблема, о которой я спрашиваю.) У меня настроены условия, которые показывают сообщение для другого ответа на счет коды. Таким образом, теперь, после покупки в первый раз, в любое время после отображения сообщения о том, что товар уже принадлежит.

Однако я запросил покупки в этом блоке и смог вернуть успешный объект PurchaseResult, после чего я смог использовать метод getPurchaseList, чтобы узнать подробности о покупке, и он не был нулевым, как это в случае, который я объяснил выше. Вот этот фрагмент кода:

else if (responseCode.getResponseCode() == BillingResponseCode.ITEM_ALREADY_OWNED) {
     getMessage("Item already owned");
     Purchase.PurchasesResult PR = mBillingClient.queryPurchases(BillingClient.SkuType.INAPP);    


getMessage(String.valueOf(PR.getPurchasesList().get(0).getSku())); 
}

Проблема в том, что я отправляю mBillingClient классу AysncTask, и он теряет свою ссылку и весь смысл?

Если так, как я могу это исправить?

1 Ответ

0 голосов
/ 15 июля 2019

Итак, в итоге мне нужно было использовать startConnection метод BillingClient. После этого все заработало как хотелось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...