Sobes.tech
Junior

Kaip paleisti sinchroninį kodą ir gauti jo rezultatą?

sobes.tech AI

Atsakymas iš AI

Galite naudoti blokuojančius skambučius atskirame sraute, pavyzdžiui, per Thread arba AsyncTask (nors pastarasis yra pasenęs).

// Pavyzdys su Thread
fun performBlockingOperation(): String {
    // Ilgos operacijos imitacija
    Thread.sleep(2000)
    return "Sinchroninės operacijos rezultatas"
}

fun runSynchronousCode() {
    // Sukuriame naują srautą
    val thread = Thread {
        try {
            val result = performBlockingOperation()
            // Rezultatą galima grąžinti atgal į pagrindinį srautą
            // per Handler arba runOnUiThread
            println("Gautas rezultatas: $result")
        } catch (e: Exception) {
            println("Klaida: ${e.message}")
        }
    }
    // Pradedame srautą
    thread.start()

    // Jei reikia gauti rezultatą UI sraute
    // Handler(Looper.getMainLooper()).post {
    //    // UI atnaujinimas
    // }
}

Šiuolaikinis alternatyvus būdas yra naudoti korutinas su blokuojančiais dispatcher'iais (nors tai gali būti ne geriausias pasirinkimas UI srautui).

import kotlinx.coroutines.*

suspend fun performBlockingCoroutineOperation(): String {
    // Ilgos operacijos imitacija
    delay(2000)
    return "Korutinos rezultatas"
}

fun runBlockingCoroutine() {
    // Pradedame blokuojančią korutiną
    runBlocking {
        try {
            val result = performBlockingCoroutineOperation()
            println("Korutinos rezultatas: $result")
        } catch (e: Exception) {
            println("Klaida korutinoje: ${e.message}")
        }
    }
}

Svarbu vengti blokuojančių skambučių pagrindiniame UI sraute (Main Thread), kad būtų išvengta ANR (Application Not Responding).