我正在编写一个简单的 Android 应用程序,它需要在后台执行长时间运行的任务,然后返回该响应(任务长度最多为 10 分钟)。 Kotlin 中似乎有数十种运行异步任务的方法,所有这些方法都有自己奇怪的怪癖。
我希望它工作的方式(用于测试)是创建一个带有标题和值的行。它应该在后台启动异步任务时放入该值的占位符文本。任务完成后,我希望值会更新。不需要与应用程序进行任何用户交互。
我尝试使用 LaunchedEffect 来做到这一点,因为这似乎是最简单的技术,使用可组合函数,例如:
@Composable
fun addLine(name: String, pwd: String)
{
Row
{
var output: String="Not Found"
Text(name)
LaunchedEffect(Unit)
{
val guess: String=bruteforce(pwd)
if (guess != "")
{
# Value to update the text to
output=guess
}
}
# This is the text the needs to change
Text(output)
}
}
我无法想出任何简单的方法来做到这一点,所有易于 Google 搜索的示例都需要用户交互或多个额外步骤或奇怪的自定义库。这应该是一个微不足道的任务,并且在其他框架中,但完全击败了我。
我并不太在意是否应该这样做——我只是想要一种简单的机制,用异步执行的值来更新一个或多个文本字段。复杂的任务只会执行一次。
您启动一个协程作用域并运行您的代码。您可以使用
output
维持状态。如果您根据结果更新 output
,则 Text
将被更新。这是实现目标的简单方法。然而,在这种类型的逻辑中,如果您的 addLine
compose 函数经历了完全重构,则需要 10 分钟执行的代码可能需要重新启动。
为了获得更强大的解决方案,使用
viewModel
和 stateFlow
更有意义。不过,既然你特意要求最简单的逻辑,我就这样实现了
val scope = rememberCoroutineScope()
var output by remember { mutableStateOf("") }
scope.launch {
delay(1000) // here add your logic
output = "your text after logic" // set output to text
}
Text(output)