Я внедряю биллинг в приложении. Я могу делать все, что хочу, пока не проверю предыдущие покупки пользователей. В своем первом упражнении в 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, и он теряет свою ссылку и весь смысл?
Если так, как я могу это исправить?