Kotlin coroutines [kotlin]将函数标记为可挂起

Kotlin coroutines [kotlin]将函数标记为可挂起,kotlin-coroutines,Kotlin Coroutines,我得到了以下用于进行服务器调用的函数 suspend fun <T: BaseResponse> processPost(post:Post):T? { val gson=Gson() val data=gson.toJson(post.reqData) val res= sendPost(data,post.script) Log.d("server","res:"+res.first) //proce

我得到了以下用于进行服务器调用的函数

suspend fun <T: BaseResponse> processPost(post:Post):T? {
        val gson=Gson()
        val data=gson.toJson(post.reqData)
        val res= sendPost(data,post.script)
        Log.d("server","res:"+res.first)
        //process response here
        return null
}
private fun sendPost(data:String,url:String):Pair<String,Int> {
        //send data to server
}
suspend-fun-processPost(post:post):T?{
val gson=gson()
val data=gson.toJson(post.reqData)
val res=sendPost(数据,post.script)
Log.d(“服务器”、“资源:”+res.first)
//在此处理响应
返回空
}
private fun sendPost(数据:字符串,url:字符串):对{
//向服务器发送数据
}

在某些情况下,
processPost
可能进入无限循环(例如等待访问令牌刷新)。当然,这段代码永远不应该在主线程上运行。但是当我将此函数标记为
suspend
时,IDE将其提升为冗余。这没什么大不了的,但我很好奇,那么我该如何限制主线程上的函数执行?

您似乎对协同程序有相当多的了解。不可能在一个答案中涵盖所有你需要知道的。这就是教程的目的。无论如何,我会尽力回答你提出的问题。在你学习这些概念之前,它可能没有意义,如果我的回答没有帮助,我很抱歉

就像许多其他事情一样,协同程序不是魔法。如果你不了解某件东西的功能,你就不能希望它具有你想要的特性。这听起来可能有些刺耳,但我想强调的是,这种心态是产生bug的主要原因


使函数
suspend
ing允许调用函数体中的其他挂起函数。它不会使阻塞调用成为非阻塞调用,也不会自动为您跳转线程

您可以使用将执行跳转到另一个线程

suspend fun xyz() = withContext(Dispatchers.IO) {
  ...
}
当您在主线程中调用
xyz
时,它会将任务交给IO调度程序。在不被阻止的情况下,它可以处理应用程序中的其他内容


编辑有关评论的内容

对不起,我对你的错误观念如此傲慢和错误的猜测

如果您只是想让编译器/IDE对警告闭嘴,只需将
@Suppress(“RedundantSuspendModifier”)
添加到函数中即可。但你不应该,因为编译器比你更清楚,至少现在是这样

协同程序最棒的一点是,您可以在不阻塞主线程的情况下直接编写

launch(Dispatchers.Main) {
    val result = makeAnHttpCall() // this can take a long time
    messWithUi(result) // changes to the UI has to be in the main thread
}
我希望现在很明显,
suspend
修饰符不会阻止主线程调用函数

@Suppress("RedundantSuspendModifier")
suspend fun someHeavyComputation(): Result {
    return ...
}


launch(Dispatchers.Main) {
    val result = someHeavyComputation() // this will run in the main thread
    messWithUi(result)
}
现在,如果不希望在主线程中进行计算:

suspend fun someHeavyComputation() = withContext(Dispatchers.Default) {
    ... // this will be in a thread pool
}


进一步阅读:。

谢谢,我知道所有这些。让我澄清我的问题。假设我们有一个内部计算量大的函数,它不调用任何挂起函数。我的目标是限制在协同路由之外的任何地方使用此函数。Ide认为挂起是多余的。无论如何,我找到了可接受的解决方法:添加
kotlinx.coroutines.delay(0)
我的函数。如果不在主线程中启动协同路由,您会错过很多好处。我的协同路由是用于网络调用的,您所说的“在主线程中启动它们”是什么意思?可能这一点我还不太明白。在主线程中运行协同路由不是会冻结它吗?如果协同路由完成了,我会补充一些细节,以及进一步阅读的链接。我希望它能把事情弄清楚。