Sobes.tech
Junior

Jak uruchomić kod synchroniczny i uzyskać jego wynik?

sobes.tech AI

Odpowiedź od AI

Możesz użyć wywołania blokującego w osobnym wątku, na przykład za pomocą Thread lub AsyncTask (chociaż ten ostatni jest przestarzały).

// Przykład z Thread
fun performBlockingOperation(): String {
    // Symulacja długiej operacji
    Thread.sleep(2000)
    return "Wynik operacji synchronicznej"
}

fun runSynchronousCode() {
    // Tworzymy nowy wątek
    val thread = Thread {
        try {
            val result = performBlockingOperation()
            // Wynik można przekazać z powrotem do głównego wątku
            // przez Handler lub runOnUiThread
            println("Otrzymany wynik: $result")
        } catch (e: Exception) {
            println("Błąd: ${e.message}")
        }
    }
    // Uruchamiamy wątek
    thread.start()

    // Jeśli trzeba uzyskać wynik w wątku UI
    // Handler(Looper.getMainLooper()).post {
    //    // Aktualizacja UI
    // }
}

Alternatywne nowoczesne podejście to użycie korutyn z blokującymi dispatcherami (chociaż może to nie być najlepsza opcja dla wątku UI).

import kotlinx.coroutines.*

suspend fun performBlockingCoroutineOperation(): String {
    // Symulacja długiej operacji
    delay(2000)
    return "Wynik operacji w korutynie"
}

fun runBlockingCoroutine() {
    // Uruchomienie blokującej korutyny
    runBlocking {
        try {
            val result = performBlockingCoroutineOperation()
            println("Wynik z korutyny: $result")
        } catch (e: Exception) {
            println("Błąd w korutynie: ${e.message}")
        }
    }
}

Ważne jest unikanie blokujących wywołań w głównym wątku UI (Main Thread), aby zapobiec ANR (Application Not Responding).