Sobes.tech
Junior

Como executar código síncrono e obter o seu resultado?

sobes.tech IA

Resposta da IA

Pode usar uma chamada bloqueante numa thread separada, por exemplo, através de Thread ou AsyncTask (embora este esteja obsoleto).

// Exemplo com Thread
fun performBlockingOperation(): String {
    // Simulação de uma operação longa
    Thread.sleep(2000)
    return "Resultado da operação síncrona"
}

fun runSynchronousCode() {
    // Criar uma nova thread
    val thread = Thread {
        try {
            val result = performBlockingOperation()
            // O resultado pode ser devolvido à thread principal
            // através de Handler ou runOnUiThread
            println("Resultado obtido: $result")
        } catch (e: Exception) {
            println("Erro: ${e.message}")
        }
    }
    // Iniciar a thread
    thread.start()

    // Se precisar obter o resultado na thread UI
    // Handler(Looper.getMainLooper()).post {
    //    // Atualizar UI
    // }
}

Uma abordagem moderna alternativa é usar corrotinas com despachadores bloqueantes (embora isso possa não ser a melhor opção para a thread UI).

import kotlinx.coroutines.*

suspend fun performBlockingCoroutineOperation(): String {
    // Simulação de uma operação longa
    delay(2000)
    return "Resultado da operação síncrona na coroutine"
}

fun runBlockingCoroutine() {
    // Executar uma coroutine bloqueante
    runBlocking {
        try {
            val result = performBlockingCoroutineOperation()
            println("Resultado obtido da coroutine: $result")
        } catch (e: Exception) {
            println("Erro na coroutine: ${e.message}")
        }
    }
}

É importante evitar chamadas bloqueantes na thread principal da UI (Main Thread) para prevenir ANR (Aplicação Não Responde).