You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin的suspend fun方法如何转换为等效Java代码实现

Kotlin suspend 函数转Java实现方案

Java本身没有原生支持Kotlin协程的suspend关键字,针对你当前的Billing查询场景,以及通用的suspend函数调用需求,有以下两种实现方案:

方案1:直接使用BillingClient原生Java API(最适配当前场景)

你代码中用到的queryPurchasesAsync suspend方法是Kotlin专属扩展,原生Java版BillingClient自带带回调的异步接口,可以直接实现和原Kotlin代码完全等效的逻辑:

private void queryPurchases() {
    // 先查询内购商品
    mBillingClient.queryPurchasesAsync(BillingClient.SkuType.INAPP, (billingResult, purchasesList) -> {
        if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
            processPurchases(purchasesList, true);
        }
        // 内购查询完成后再查询订阅,和原suspend方法执行顺序一致
        mBillingClient.queryPurchasesAsync(BillingClient.SkuType.SUBS, (subsBillingResult, subsPurchasesList) -> {
            if (subsBillingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                processPurchases(subsPurchasesList, true);
            }
        });
    });
}

方案2:通用Kotlin suspend函数调用方案

如果需要调用没有Java友好回调接口的Kotlin suspend方法,可以通过Kotlin协程作用域启动协程执行,需要项目引入kotlin-stdlib、kotlinx-coroutines-android依赖:

// 根据使用场景选择合适的协程作用域,例如ViewModel中可直接使用viewModelScope
CoroutineScope customScope = CoroutineScopeKt.CoroutineScope(Dispatchers.getMain().getImmediate());

customScope.launch(Dispatchers.getIO(), null, (Continuation<? super Unit> continuation) -> {
    // 执行suspend方法,传入continuation参数
    PurchasesResult inappResult = mBillingClient.queryPurchasesAsync(BillingClient.SkuType.INAPP, continuation);
    processPurchases(inappResult.getPurchasesList(), true);
    PurchasesResult subsResult = mBillingClient.queryPurchasesAsync(BillingClient.SkuType.SUBS, continuation);
    processPurchases(subsResult.getPurchasesList(), true);
    return Unit.INSTANCE;
});

注意需要自行管理协程作用域的生命周期,在页面/组件销毁时调用customScope.cancel()避免内存泄漏

内容的提问来源于stack exchange,提问作者user7581159

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 04:36:04