android - com.android.billingclient :billing-ktx dispatch to Dispatchers. IO 中的 kotlin 扩展在内部起作用吗?

标签 android kotlin kotlin-coroutines kotlin-android-extensions android-billing

阅读计费客户端的文档,有一个标题为 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/

相关文章:

kotlin - 当我使用多个流时,Kafka Streams StreamsException

java - fragment 中的 OnClickListener 不再起作用

android - 条件失败时无法停止 CoroutineWorker

android - 如何从 Fragment 或 Activity 调用挂起函数?

java - 哈希表列表更新所有字符串值

Android 检测来自任何应用程序的屏幕边缘手势

android - 是否可以查询Android Market返回特定权限的应用?

java - 为什么 Kotlin 字节码会引用 java.util.function.BiConsumer?

android - 将协程与 fragment 一起使用的最佳实践是什么?

android - 旋转 bmp 并将其正面朝上显示