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");
});
我正在设置一个界面来使用 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");
});