Jai*_*odi 4 android coroutine kotlin kotlin-coroutines
我创建了如下功能:
fun getPercentage(id:String): String {
var percentage=""
scope.launch {
percentage=repo.getPercentage(id)?.get(0)?.percent.toString()
Log.e("$$$ value >>","$$$ value >>"+percentage)
}
Log.e("$$$ value outside >>","$$$ value >>"+percentage)
return percenatge
}
Run Code Online (Sandbox Code Playgroud)
在这里,我无法使用变量:百分比返回更新后的值。
我得到的日志如下:
$$$ value outside >>
$$$ value >> 50
Run Code Online (Sandbox Code Playgroud)
意味着我无法返回最新值。流程出了问题。
有人建议我使用 async{} 和await()。但我不知道这对这里有什么帮助?
请指导。谢谢。
该函数通过launchgetPercentage
函数在后台创建一个协程,然后无需等待即可继续运行。因此,您的“外部”代码在“内部”协程完成之前运行。
第一个选项是使用async函数来从协程返回Deferred值:
fun getPercentage(id:String): Deferred<String> {
return scope.async {
percentage=repo.getPercentage(id)?.get(0)?.percent.toString()
Log.e("$$$ value >>","$$$ value >>"+percentage)
}
}
Run Code Online (Sandbox Code Playgroud)
当然请注意,您更有可能想要创建getPercentage
一个挂起函数,然后await
直接调用:
suspend fun getPercentage(id:String): String {
val percentageDeferred = scope.async {
percentage=repo.getPercentage(id)?.get(0)?.percent.toString()
Log.e("$$$ value >>","$$$ value >>"+percentage)
}
val percentage = percentageDeferred.await()
Log.e("$$$ value outside >>","$$$ value >>"+percentage)
return percentage
}
Run Code Online (Sandbox Code Playgroud)
您也可能想在之前执行其他操作,否则await
您最好也创建repo.getPercentage
一个挂起函数并直接调用它:
suspend fun getPercentage(id:String): String {
// if repo.getPercentage is a suspend function, this call suspends
// like the await in the previous example
val percentage = repo.getPercentage(id)?.get(0)?.percent.toString()
Log.e("$$$ value outside >>","$$$ value >>"+percentage)
return percentage
}
Run Code Online (Sandbox Code Playgroud)
请参阅Kotlin 文档中的使用异步并发。
归档时间: |
|
查看次数: |
7872 次 |
最近记录: |