Android - 更新计费库产品的 SkuDetailsResponse 按钮

Android - updating button onSkuDetailsResponse for Billing Library products

我正在设置一个界面来使用 Google Play 结算库。我使用 querySkuDetailsAsync 查询订阅产品,然后循环浏览返回的产品,以便启用购买按钮。

这是我正在使用的脚本

billingClient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() {
        @Override
        public void onSkuDetailsResponse(@NonNull BillingResult billingResult, @Nullable List<SkuDetails> list) {
            
            if (!list.isEmpty()) {
                for (int i = 0; i < list.size(); i++) {
                    
                    if (list.get(i).getSku().equals("core_monthly")) {
                        monthlyDetails = list.get(i);
                        

                    } else if (list.get(i).getSku().equals("core_annual")) {
                        annualDetails = list.get(i);
                        
                    }
                }

                monthlySubscribe.setEnabled(true);
                annualSubscribe.setEnabled(true);
                monthlySubscribe.setText("Monthly Subscription");
                annualSubscribe.setText("Annual Subscription");

            } else {
                Toast.makeText(getActivity(), "There was a problem getting available plans", Toast.LENGTH_SHORT);
            }
        }
    });

问题是 setText() 按钮文本永远不会更新。拿到产品后如何更新按钮名称并启用它们?

.setText() 不起作用的原因是因为在 background thread 中调用了 billingClient 方法,如您的日志所示:Thread: PlayBillingLibrary-2。与 UI 相关的任何内容都必须在 main thread.

中调用

要解决这个问题,您必须这样做:

将此方法添加到您的项目中:

private Handler findUiHandler() {
        return new Handler(Looper.getMainLooper());
    }

然后,每当您想更新 UI 而线程不是 main thread 时,请像这样调用您的代码:

 findUiHandler().post(() -> {
                //here is the code that needs to be executed on the main thread
                monthlySubscribe.setEnabled(true);
                annualSubscribe.setEnabled(true);
                monthlySubscribe.setText("Monthly Subscription");
                annualSubscribe.setText("Annual Subscription");
            });