【问题标题】:UI element updates does not work when purchase completed - Google billing client 4购买完成后 UI 元素更新不起作用 - Google 计费客户端 4
【发布时间】:2026-01-21 17:40:01
【问题描述】:

我已改用 Google 计费客户端 4.0 库。从那以后购买完成后,我的 ui 元素更新不起作用。

我试图检查它们是否不再在 UThread 中或其他什么,但它仍然无法正常工作。

billingClient!!.acknowledgePurchase(
                            acknowledgePurchaseParams
                        ) { billingResult ->
                            if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {
                                saveSubscription(purchase.purchaseToken, sku)
                                mainAct?.runOnUiThread {
                                Toast.makeText(context , "Vásárlás sikeres", Toast.LENGTH_SHORT)
                                        .show()
                                delegate?.purchaseSuccess(
                                        actProduct,
                                        prevProduct,
                                        purchase.purchaseToken
                                    )
                                }
                            }
                        }

确认完成后,我的 UI 元素应该会更新。应该启用一个菜单项,并且在购买页面中,一个文本字段应该显示该项目已购买。代码正在运行,但 UI 元素未更新。

一旦我移动到不同的片段,菜单项就会变为启用,所以在我看来,UI 没有刷新。

在代码中 mainAct 是 MainActivity 的上下文。

有什么想法吗?

代码在 Billing 库 3.0.3 上正常运行,并且根本不需要 runOnUIThread。

这个库仍然有奇怪的行为。在我的用户登录应用程序并从登录页面转到第一个片段的同时,我正在设置帐单。这个片段有一个 recyclerview,这个 recycler 视图充满了来自网络的数据。回收器视图随机不显示元素,即使它们已加载并且适配器已正确更新。

您移动到另一个片段并返回回收站视图正确显示数据。

正如我所说,第一次调用计费服务器时,UIThread 被搞砸了,即使更新了数据标签或菜单,也没有显示更新。

所以这个库肯定有问题。

有什么想法吗?

【问题讨论】:

    标签: kotlin ui-thread google-play-billing


    【解决方案1】:

    这种行为有点奇怪。文档说大多数计费库函数可以从任何线程运行。只有少数需要在 UIThread 上运行。 AcknowlegdePurchase 应该在 AnyThread 上运行。

    我已将 Toast 放入 runOnUIThread 和委托函数内部,我还将所有命令放入 runOnUIThread 闭包中。

    现在它可以在计费库 3.0.3 上使用。但是文档没有说明任何这些变化,所以真的不清楚为什么两个库之间的行为发生了如此大的变化。

    【讨论】: