Код: Выделить всё
public class BillingManager {
private List
productDetailsList;
private PurchasesUpdatedListener purchasesUpdatedListener = (billingResult, purchases) -> {
// To be implemented in a later section.
};
private BillingClient billingClient = BillingClient.newBuilder(MyApplication.getAppContext())
.setListener(purchasesUpdatedListener)
.enablePendingPurchases(PendingPurchasesParams.newBuilder().enableOneTimeProducts().build())
.build();
public void establishConnection() {
billingClient.startConnection(new BillingClientStateListener() {
@Override
public void onBillingSetupFinished(BillingResult billingResult) {
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
Log.i("BillingManager", "Connected to Google Play.");
getProductDetails();
}
}
@Override
public void onBillingServiceDisconnected() {
Log.i("BillingManager", "Disconnected from Google Play.");
establishConnection();
}
});
}
private void getProductDetails() {
QueryProductDetailsParams queryProductDetailsParams =
QueryProductDetailsParams.newBuilder()
.setProductList(List.of(
QueryProductDetailsParams.Product.newBuilder()
.setProductId("full_version")
.setProductType(BillingClient.ProductType.INAPP)
.build()))
.build();
billingClient.queryProductDetailsAsync(
queryProductDetailsParams,
(billingResult, productDetailsList) -> {
this.productDetailsList = productDetailsList;
}
);
}
public List getProductDetailsList() {
return productDetailsList;
}
public void launchPurchaseFlow(Activity activity, ProductDetails productDetails) {
List productDetailsParamsList =
List.of(
BillingFlowParams.ProductDetailsParams.newBuilder()
// retrieve a value for "productDetails" by calling queryProductDetailsAsync()
.setProductDetails(productDetails)
.build()
);
BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
.setProductDetailsParamsList(productDetailsParamsList)
.build();
// Launch the billing flow
BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);
}
}
Код: Выделить всё
BillingManager billingManager = new BillingManager();
billingManager.establishConnection();
MaterialButton button = view.findViewById(R.id.button);
// This causes an outOfBounds exception
button.setText(billingManager.getProductDetailsList().get(0).getOneTimePurchaseOfferDetails().getFormattedPrice());
button.setOnClickListener(v -> {
billingManager.launchPurchaseFlow(getActivity(), billingManager.getProductDetailsList().get(0));
});
}
Я сталкиваюсь с исключением IndexOutOfBoundsException при попытке установить текст кнопки с ценой продукта получено из библиотеки Google Play Billing. Строка, вызывающая проблему:
button.setText(billingManager.getProductDetailsList().get(0).getOneTimePurchaseOfferDetails().getFormattedPrice());
Проблема связана с асинхронными методами installConnection и getProductDetails в моем классе BillingManager. Когда фрагмент запускается и пытается получить доступ к сведениям о продукте для установки текста кнопки, эти операции еще не завершены, что приводит к пустому или неинициализированному списку.
Как я могу решить эту проблему и обеспечить, чтобы текст кнопки устанавливался только после того, как было установлено соединение с Google Play Billing и успешно получены сведения о продукте?
Подробнее здесь: https://stackoverflow.com/questions/793 ... lingclient
Мобильная версия