【问题标题】:Why does the querySkuDetails need to run in IO context?为什么 querySkuDetails 需要在 IO 上下文中运行?
【发布时间】:2020-06-15 09:52:50
【问题描述】:

根据https://developer.android.com/google/play/billing/integrate billingClient.querySkuDetails 是用withContext(Dispatchers.IO) 调用的

fun querySkuDetails() {
    val skuList = ArrayList<String>()
    skuList.add("premium_upgrade")
    skuList.add("gas")
    val params = SkuDetailsParams.newBuilder()
    params.setSkusList(skuList).setType(SkuType.INAPP)
    val skuDetailsResult = withContext(Dispatchers.IO) {
        billingClient.querySkuDetails(params.build())
    }
    // Process the result.
}

我很好奇它带来了哪些好处,因为querySkuDetails 已经是一个暂停功能。那么我在这里获得什么。

我可以用

编写相同的代码
val skuDetailsResult = coroutineScope {
        billingClient.querySkuDetails(params.build())
}

没有更多上下文,我不知道如何下载计费客户端的源代码。

【问题讨论】:

    标签: kotlin-coroutines play-billing-library


    【解决方案1】:

    被调用的底层方法是querySkuDetailsAsync,它接受一个回调并异步执行网络请求。

    你说得对,那里不需要withContext(Dispatchers.IO),它实际上引入了不必要的开销。

    来自https://stackoverflow.com/a/62182736/6167844

    这似乎是一个常见的误解,即仅仅因为 IO 是由挂起函数执行的,就必须在 Dispatchers.IO 中调用它,这是不必要的(而且可能很昂贵)。

    按照惯例暂停函数不会阻塞调用线程,如果需要,会在 Dispatchers.IO 内部阻塞。

    【讨论】:

      猜你喜欢
      • 2016-02-11
      • 2018-12-24
      • 1970-01-01
      • 1970-01-01
      • 2016-02-02
      • 1970-01-01
      • 2018-05-26
      • 1970-01-01
      • 2014-09-15
      相关资源
      最近更新 更多