阅读计费客户端的文档,有一个标题为 Querying with Kotlin extensions 的部分。显示的示例包括对 Dispatchers.IO
的调度,如下所示:
val productDetailsResult = withContext(Dispatchers.IO) {
billingClient.queryProductDetails(params.build())
}
withContext
也显示在其他挂起函数上。 ktx lib中的queryProductDetails
等都是挂起函数。为什么文档包含 withContext
?我无法想象创建一个只是阻塞线程的挂起函数的目的,在我看来,它应该在内部分派(dispatch)到 Dispatchers.IO ,在示例代码是多余的。
我的评估正确吗?我可以省略 withContext
block 而不阻塞主线程(假设调用上下文位于 Dispatchers.Main
上)吗?我无法确定它在使用调试器做什么,并且似乎没有任何有关扩展功能的文档。
我想写的只是:
val productDetailsResult = billingClient.queryProductDetails(params.build())
最佳答案
queryProductDetails
扩展函数的反编译 Java
代码如下所示:
@Nullable
@RecentlyNonNull
public static final Object queryProductDetails(@RecentlyNonNull BillingClient $this$queryProductDetails, @RecentlyNonNull QueryProductDetailsParams params, @RecentlyNonNull Continuation $completion) {
final CompletableDeferred var3 = CompletableDeferredKt.CompletableDeferred$default((Job)null, 1, (Object)null);
ProductDetailsResponseListener var4 = new ProductDetailsResponseListener() {
public final void onProductDetailsResponse(BillingResult billingResult, List productDetailsList) {
Intrinsics.checkNotNullExpressionValue(billingResult, "billingResult");
ProductDetailsResult var3x = new ProductDetailsResult(billingResult, productDetailsList);
var3.complete(var3x);
}
};
$this$queryProductDetails.queryProductDetailsAsync(params, var4);
return var3.await($completion);
}
我们可以看到它在底层使用了queryProductDetailsAsync
,因此它是异步运行的。因此我们可以得出结论,调用没有阻塞,我们不需要将 billingClient.queryProductDetails(params.build())
包装到 withContext(Dispatchers.IO)
中:
val productDetailsResult = billingClient.queryProductDetails(params.build())
关于android - com.android.billingclient :billing-ktx dispatch to Dispatchers. IO 中的 kotlin 扩展在内部起作用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73562979/