Библиотека выставления счетов Android и темы [закрыто] ⇐ Android
Библиотека выставления счетов Android и темы [закрыто]
У меня уже несколько лет есть приложение для Android в Google PlayStore, но недавно, во время обновлений Android, мой платежный код перестал работать без каких-либо изменений кода. Должно быть, я что-то ужасно неправильно делаю с потоками, и мой поток пользовательского интерфейса либо зависает, либо не обновляется. Во время отладки мне дважды удалось заставить его работать без изменений кода, так что я предполагаю, что это как-то связано со всем тем хаосом, который есть в коде.
Может ли кто-нибудь легко определить, что я делаю неправильно? Вот код, о котором идет речь, когда я запрашиваю продукты в Google:
public void fetchProductsFromGoogle(final List BasicProductList, Final Runnable runnable) { окончательный список skuList = новый ArrayList(); для (Продукт: базовый списокпродуктов) { skuList.add(product.getProductId()); } ArrayList ProductList = новый ArrayList(); for(String sku : skuList) { ProductList.add( QueryProductDetailsParams.Product.newBuilder() .setProductId(артикул) .setProductType(BillingClient.ProductType.SUBS) .строить() ); } QueryProductDetailsParams params = QueryProductDetailsParams.newBuilder() .setProductList(списокпродуктов) .строить(); billingClient.queryProductDetailsAsync(params, new ProductDetailsResponseListener() { @Override public void onProductDetailsResponse(@NonNull BillingResult billingResult, @NonNull List skuDetailsList) { if(billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && skuDetailsList != null) { for (int i = 0; i < skuDetailsList.size(); я ++) { mSkuDetailsMap.put(skuDetailsList.get(i).getProductId(), skuDetailsList.get(i)); skuDetailsList.get(i).getSubscriptionOfferDetails().get(0). getPricingPhases().getPricingPhaseList().get(0).getPriceCurrencyCode(); BasicProductList.get(i).setProductDesc(skuDetailsList.get(i).getDescription()); BasicProductList.get(i).setProductPrice(skuDetailsList.get(i).getSubscriptionOfferDetails().get(0). getPricingPhases().getPricingPhaseList().get(0).getFormattedPrice()); BasicProductList.get(i).setProductFromGoogle(true); мПродуктСписок = базовыйСписокПродуктов; } Runnable.run(); } еще { Log.w(TAG,"Невозможно получить товары из Google. Код ответа: " + billingResult.getResponseCode()); mProductList = CommonHelper.getBasicProductList(); Runnable.run(); } } }); } И код, который это вызывает:
public void startServiceConnection(final Runnable runnable) { billingClient.startConnection(новый BillingClientStateListener() { @Override public void onBillingSetupFinished (BillingResult billingResult) { if(billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { isServiceConnected = правда; fetchProductsFromGoogle(CommonHelper.getBasicProductList(), runnable); } еще { если (mActivity экземпляр MyAccountActivity) { ((BaseActivity) mActivity).showValidationAlert("Предупреждение", mActivity.getString(R.string.pays_not_allowed)); мПродуктЛист = ноль; Runnable.run(); } еще { мПродуктЛист = ноль; Runnable.run(); } } } @Override общественная недействительность onBillingServiceDisconnected () { isServiceConnected = ложь; } }); } И, наконец, это код пользовательского интерфейса, который прослушивает настройки платежных данных:
checkSession(new Runnable() { @Override общественный недействительный запуск () { iabHelper = новый IABHelper(MyAccountActivity.this, новый IABHelper.BillingUpdatesListener() { @Override public void onBillingClientSetupFinished(List ProductList) { toggleProgressBar (ложь); setupAccountScreen (список продуктов); } }); } }); public void toggleProgressBar (видимое логическое значение) { RelativeLayout ProgressBarLayout = (RelativeLayout) findViewById (R.id.progressBarLayout); ProgressBar ProgressBar = (ProgressBar) findViewById (R.id.progressBar); если (видимый) { ProgressBarLayout.setVisibility(View.VISIBLE); ProgressBar.animate(); ProgressBar.setVisibility(View.VISIBLE); } еще { ProgressBarLayout.setVisibility(View.GONE); ProgressBarLayout.setVisibility(View.GONE); } } public void setupAccountScreen(List ProductList) { String BulletPoints = getString(R.string.Payment_bullet1); BulletPoints += getString(R.string.Payment_bullet2) + "\n"; BulletPoints += getString(R.string.Payment_bullet3) + "\n"; BulletPoints += getString(R.string.Payment_bullet4) + "\n"; BulletPoints += getString(R.string.Payment_bullet5) + "\n"; TextView tvBullets = findViewById(R.id.tvRenewalPoints); tvBullets.setText(bulletPoints); TextView tvCurrentMembership = findViewById(R.id.tvCurrentMembership); TextView tvFeatures = findViewById(R.id.tvFeatures); tvCurrentMembership.setText(getString(R.string.free_label)); Целочисленный тип подписки = getSubscriptionType(); Строковые функции = getString(R.string.free_features); if(subscriptionType > 1 && getIsSubscriptionActive()) { если (тип подписки == 2) { tvCurrentMembership.setText("Золото"); функции = getString(R.string.gold_features); } иначе, если (тип подписки == 3) { tvCurrentMembership.setText("Платина"); функции = getString(R.string.platinum_features); } иначе, если (тип подписки == 4) { tvCurrentMembership.setText("Серебро"); функции = getString(R.string.silver_features); } } tvFeatures.setText(функции); Log.i(TAG, «Тип подписки:» + тип подписки); ImageView imgLogo = findViewById(R.id.imgLogo); TextView tvСпасибо = findViewById(R.id.txtNotAvailable); если (productList! = ноль) { tvthanks.setVisibility(View.GONE); imgLogo.setVisibility(View.GONE); ProductRecycler = (RecyclerView) findViewById(R.id.rvPayment); ProductListAdapter = новый ProductListAdapter(MyAccountActivity.this, ProductList, SubscriptionType); ProductRecycler.setAdapter(productListAdapter); } еще { tvСпасибо.setVisibility(View.VISIBLE); imgLogo.setVisibility(View.VISIBLE); } } Я могу заставить отладчик проходить весь путь через выставление счетов, получение продуктов, но всякий раз, когда код решает запустить что-либо, связанное с пользовательским интерфейсом, например настройку текстовых представлений на экране или остановку индикатора выполнения, он зависает.
У меня уже несколько лет есть приложение для Android в Google PlayStore, но недавно, во время обновлений Android, мой платежный код перестал работать без каких-либо изменений кода. Должно быть, я что-то ужасно неправильно делаю с потоками, и мой поток пользовательского интерфейса либо зависает, либо не обновляется. Во время отладки мне дважды удалось заставить его работать без изменений кода, так что я предполагаю, что это как-то связано со всем тем хаосом, который есть в коде.
Может ли кто-нибудь легко определить, что я делаю неправильно? Вот код, о котором идет речь, когда я запрашиваю продукты в Google:
public void fetchProductsFromGoogle(final List BasicProductList, Final Runnable runnable) { окончательный список skuList = новый ArrayList(); для (Продукт: базовый списокпродуктов) { skuList.add(product.getProductId()); } ArrayList ProductList = новый ArrayList(); for(String sku : skuList) { ProductList.add( QueryProductDetailsParams.Product.newBuilder() .setProductId(артикул) .setProductType(BillingClient.ProductType.SUBS) .строить() ); } QueryProductDetailsParams params = QueryProductDetailsParams.newBuilder() .setProductList(списокпродуктов) .строить(); billingClient.queryProductDetailsAsync(params, new ProductDetailsResponseListener() { @Override public void onProductDetailsResponse(@NonNull BillingResult billingResult, @NonNull List skuDetailsList) { if(billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && skuDetailsList != null) { for (int i = 0; i < skuDetailsList.size(); я ++) { mSkuDetailsMap.put(skuDetailsList.get(i).getProductId(), skuDetailsList.get(i)); skuDetailsList.get(i).getSubscriptionOfferDetails().get(0). getPricingPhases().getPricingPhaseList().get(0).getPriceCurrencyCode(); BasicProductList.get(i).setProductDesc(skuDetailsList.get(i).getDescription()); BasicProductList.get(i).setProductPrice(skuDetailsList.get(i).getSubscriptionOfferDetails().get(0). getPricingPhases().getPricingPhaseList().get(0).getFormattedPrice()); BasicProductList.get(i).setProductFromGoogle(true); мПродуктСписок = базовыйСписокПродуктов; } Runnable.run(); } еще { Log.w(TAG,"Невозможно получить товары из Google. Код ответа: " + billingResult.getResponseCode()); mProductList = CommonHelper.getBasicProductList(); Runnable.run(); } } }); } И код, который это вызывает:
public void startServiceConnection(final Runnable runnable) { billingClient.startConnection(новый BillingClientStateListener() { @Override public void onBillingSetupFinished (BillingResult billingResult) { if(billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { isServiceConnected = правда; fetchProductsFromGoogle(CommonHelper.getBasicProductList(), runnable); } еще { если (mActivity экземпляр MyAccountActivity) { ((BaseActivity) mActivity).showValidationAlert("Предупреждение", mActivity.getString(R.string.pays_not_allowed)); мПродуктЛист = ноль; Runnable.run(); } еще { мПродуктЛист = ноль; Runnable.run(); } } } @Override общественная недействительность onBillingServiceDisconnected () { isServiceConnected = ложь; } }); } И, наконец, это код пользовательского интерфейса, который прослушивает настройки платежных данных:
checkSession(new Runnable() { @Override общественный недействительный запуск () { iabHelper = новый IABHelper(MyAccountActivity.this, новый IABHelper.BillingUpdatesListener() { @Override public void onBillingClientSetupFinished(List ProductList) { toggleProgressBar (ложь); setupAccountScreen (список продуктов); } }); } }); public void toggleProgressBar (видимое логическое значение) { RelativeLayout ProgressBarLayout = (RelativeLayout) findViewById (R.id.progressBarLayout); ProgressBar ProgressBar = (ProgressBar) findViewById (R.id.progressBar); если (видимый) { ProgressBarLayout.setVisibility(View.VISIBLE); ProgressBar.animate(); ProgressBar.setVisibility(View.VISIBLE); } еще { ProgressBarLayout.setVisibility(View.GONE); ProgressBarLayout.setVisibility(View.GONE); } } public void setupAccountScreen(List ProductList) { String BulletPoints = getString(R.string.Payment_bullet1); BulletPoints += getString(R.string.Payment_bullet2) + "\n"; BulletPoints += getString(R.string.Payment_bullet3) + "\n"; BulletPoints += getString(R.string.Payment_bullet4) + "\n"; BulletPoints += getString(R.string.Payment_bullet5) + "\n"; TextView tvBullets = findViewById(R.id.tvRenewalPoints); tvBullets.setText(bulletPoints); TextView tvCurrentMembership = findViewById(R.id.tvCurrentMembership); TextView tvFeatures = findViewById(R.id.tvFeatures); tvCurrentMembership.setText(getString(R.string.free_label)); Целочисленный тип подписки = getSubscriptionType(); Строковые функции = getString(R.string.free_features); if(subscriptionType > 1 && getIsSubscriptionActive()) { если (тип подписки == 2) { tvCurrentMembership.setText("Золото"); функции = getString(R.string.gold_features); } иначе, если (тип подписки == 3) { tvCurrentMembership.setText("Платина"); функции = getString(R.string.platinum_features); } иначе, если (тип подписки == 4) { tvCurrentMembership.setText("Серебро"); функции = getString(R.string.silver_features); } } tvFeatures.setText(функции); Log.i(TAG, «Тип подписки:» + тип подписки); ImageView imgLogo = findViewById(R.id.imgLogo); TextView tvСпасибо = findViewById(R.id.txtNotAvailable); если (productList! = ноль) { tvthanks.setVisibility(View.GONE); imgLogo.setVisibility(View.GONE); ProductRecycler = (RecyclerView) findViewById(R.id.rvPayment); ProductListAdapter = новый ProductListAdapter(MyAccountActivity.this, ProductList, SubscriptionType); ProductRecycler.setAdapter(productListAdapter); } еще { tvСпасибо.setVisibility(View.VISIBLE); imgLogo.setVisibility(View.VISIBLE); } } Я могу заставить отладчик проходить весь путь через выставление счетов, получение продуктов, но всякий раз, когда код решает запустить что-либо, связанное с пользовательским интерфейсом, например настройку текстовых представлений на экране или остановку индикатора выполнения, он зависает.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение