阅读计费客户端的文档,有一个题为使用Kotlin扩展查询的部分。所示的示例包括对Dispatchers.IO
的分派,如下所示:
val productDetailsResult = withContext(Dispatchers.IO) {
billingClient.queryProductDetails(params.build())
}
withContext
也显示在其他挂起函数上。ktx和其他库中的queryProductDetails
都是挂起函数。为什么文档中包含withContext
?我无法想象做一个刚刚阻塞线程的挂起函数的目的,在我看来,它应该内部分派给Dispatchers.IO
,使示例代码中的withContext
调用变得多余。
我的评估是否正确,我是否可以省略withContext
块而不阻塞主线程(假设调用上下文在Dispatchers.Main
上)?我无法确定它对调试器做了什么,而且似乎没有任何关于扩展函数的文档。
我想写的是:
val productDetailsResult = billingClient.queryProductDetails(params.build())
发布于 2022-09-01 09:14:04
反编译的Java
queryProductDetails
扩展函数代码如下所示:
@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())
https://stackoverflow.com/questions/73562979
复制相似问题