Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 获得;suspend函数只能在协同程序体中调用;从另一个挂起函数调用挂起函数时_Android_Kotlin_Kotlin Coroutines - Fatal编程技术网

Android 获得;suspend函数只能在协同程序体中调用;从另一个挂起函数调用挂起函数时

Android 获得;suspend函数只能在协同程序体中调用;从另一个挂起函数调用挂起函数时,android,kotlin,kotlin-coroutines,Android,Kotlin,Kotlin Coroutines,我正在使用Room本地缓存用户购买的内容。为此,我创建了一个insert函数,该函数处于挂起状态 首先,在我的存储库中,我从一个名为launchBillingFlow的函数调用了insert函数,该函数处于挂起状态,其签名如下所示: suspend fun launchBillingFlow(活动,SKU详细信息) 我这样做没有错。之后,我创建了一个用于确认购买的private函数,并将insert调用移动到那里。它的签名如下所示: private-suspend-fun确认采购(购买) 但

我正在使用Room本地缓存用户购买的内容。为此,我创建了一个
insert
函数,该函数处于挂起状态

首先,在我的存储库中,我从一个名为
launchBillingFlow
的函数调用了
insert
函数,该函数处于挂起状态,其签名如下所示:

suspend fun launchBillingFlow(活动,SKU详细信息)
我这样做没有错。之后,我创建了一个用于确认购买的
private
函数,并将
insert
调用移动到那里。它的签名如下所示:

private-suspend-fun确认采购(购买)
但是当我从那里调用insert函数时,我得到以下错误:

Suspension functions can be called only within coroutine body
我不明白为什么会这样。我从一个协同程序主体调用
launchBillingFlow
,它调用
acknowledgePurchase
。我也在查询SKU的详细信息。这是一个
lint
错误还是我遗漏了什么?

这不是一个lint错误。 它说在方法中需要协同路由上下文

lint消息是:

只能在协同程序体中调用suspend函数

我知道,挂起函数只能在另一个挂起函数中调用和在协同程序中调用

相反,这个消息说它只能在协同程序内部调用,但事实上,这并不矛盾

要理解此消息,您可以忽略其中的suspend word,并按如下方式阅读此消息:

[function name]只能在协同程序主体内调用,因为它需要协同程序上下文

它需要协同路由上下文的原因不是因为它是挂起的,而是因为在它内部调用了一个需要上下文的方法。

它不是lint bug。 它说在方法中需要协同路由上下文

lint消息是:

只能在协同程序体中调用suspend函数

我知道,挂起函数只能在另一个挂起函数中调用和在协同程序中调用

相反,这个消息说它只能在协同程序内部调用,但事实上,这并不矛盾

要理解此消息,您可以忽略其中的suspend word,并按如下方式阅读此消息:

[function name]只能在协同程序主体内调用,因为它需要协同程序上下文


它需要协同路由上下文的原因不是因为它是挂起的,而是因为在它里面您调用了一个需要上下文的方法。

我知道这个信息。问题是,为什么会这样?在某个时刻,我只能从协同程序上下文调用
suspend
函数。并且我在我的存储库中链接其他
suspend
函数,在不同的情况下都不会出现此错误。例如,当用户第一次打开显示我的报价的页面时,我通过
BillingClient
查询
SkuDetails
,当我得到这些信息时,我使用基本相同的
insert
函数将它们缓存在另一个表的同一数据库中。在这种情况下,
lint
并没有对此进行抱怨。并且
lint
错误消息还意味着只能在协同程序体中调用
暂停函数,这通常是错误的,因为暂停函数也可以从其他暂停函数调用,因为我在代码中多次这样做。这个答案是不正确的。您始终可以从其他挂起函数调用挂起函数。每个挂起函数都从调用它的挂起函数获取其协同路由上下文。@Tenfour04我知道挂起函数只能在挂起函数或协同路由内调用,但如果函数A和B都是挂起的,则您的注释不正确。这并不意味着您可以始终在A内调用B,因为B可能需要某些上下文或条件这在A中是不可用的。事实上,A是挂起的只是一个条件,可能还有其他条件。我知道这些信息。问题是,为什么会这样?在某个时刻,我只能从协同程序上下文调用
suspend
函数。并且我在我的存储库中链接其他
suspend
函数,在不同的情况下都不会出现此错误。例如,当用户第一次打开显示我的报价的页面时,我通过
BillingClient
查询
SkuDetails
,当我得到这些信息时,我使用基本相同的
insert
函数将它们缓存在另一个表的同一数据库中。在这种情况下,
lint
并没有对此进行抱怨。并且
lint
错误消息还意味着只能在协同程序体中调用
暂停函数,这通常是错误的,因为暂停函数也可以从其他暂停函数调用,因为我在代码中多次这样做。这个答案是不正确的。您始终可以从其他挂起函数调用挂起函数。每个挂起函数都从调用它的挂起函数获取其协同路由上下文。@Tenfour04我知道挂起函数只能在挂起函数或协同路由内调用,但如果函数A和B都是挂起的,则您的注释不正确。这并不意味着您可以始终在A内调用B,因为B可能需要某些上下文或条件这在A中不可用。事实上,A是挂起的只是一个条件,可能还有其他条件。您确定不是从lambda或回调调用另一个挂起函数吗?@Tenfour04很好!我是从
应答器
那里打电话来确认错误的购买。我将使用
suspendCoroutine
来修复它。非常感谢。顺便说一句,我