Estou escrevendo um aplicativo Android simples que precisa executar uma tarefa de longa execução em segundo plano e, em seguida, retornar essa resposta (a duração da tarefa será de até 10 minutos). Parece haver dezenas de maneiras de executar tarefas assíncronas no Kotlin, todas com suas peculiaridades estranhas.
A maneira que quero que funcione (para teste) é criar uma linha com o título e um valor. Ele deve colocar um texto de espaço reservado para o valor enquanto inicia a tarefa assíncrona em segundo plano. Quando a tarefa terminar, espero que o valor seja atualizado. Não é necessária nenhuma interação do usuário com o aplicativo.
Tentei fazer isso com LaunchedEffect porque parece ser a técnica menos complicada, usando uma função que pode ser composta como:
@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)
}
}
Não consigo descobrir uma maneira simples de fazer isso, todos os exemplos facilmente pesquisáveis no Google exigem interações do usuário ou várias etapas extras ou bibliotecas personalizadas estranhas. Esta deveria ser uma tarefa trivial, e está em outros frameworks, mas está me derrotando totalmente.
Não estou muito preocupado se devo fazer assim - só quero um mecanismo simples para atualizar um ou mais campos de texto com um valor que seja executado de forma assíncrona. A tarefa complexa só será executada uma vez.
Você inicia um escopo de corrotina e executa seu código. Você mantém um estado usando
output
. Se você atualizaroutput
com base no resultado, oText
será atualizado. Esta é uma abordagem direta para atingir seu objetivo. Porém, nesse tipo de lógica, se suaaddLine
função de composição passar por uma recomposição completa, seu código, que leva 10 minutos para ser executado, pode precisar ser reiniciado.Para uma solução mais robusta, faria mais sentido utilizar a
viewModel
e astateFlow
. Porém, como você solicitou especificamente a lógica mais simples, eu a implementei desta forma