Отображение данных о продукте из BillingClientJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Отображение данных о продукте из BillingClient

Сообщение Anonymous »

Я создал следующий класс BillingManager для управления библиотекой платежей Google Play для моего приложения Android:

Код: Выделить всё

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);
}
}
И это пример того, как я хотел бы использовать его в одном из моих классов FragmentDialog:

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»