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
相关产品推荐
相关产品推荐

