Sobes.tech
Junior

Cum să rulezi codul sincron și să obții rezultatul său?

sobes.tech AI

Răspuns de la AI

Puteți utiliza o apelare blocantă într-un fir separat, de exemplu, prin Thread sau AsyncTask (deși acesta din urmă este învechit).

// Exemplu cu Thread
fun performBlockingOperation(): String {
    // Simulare a unei operații lungi
    Thread.sleep(2000)
    return "Rezultatul operației sincrone"
}

fun runSynchronousCode() {
    // Creăm un fir nou
    val thread = Thread {
        try {
            val result = performBlockingOperation()
            // Rezultatul poate fi transmis înapoi în firul principal
            // prin Handler sau runOnUiThread
            println("Rezultat obținut: $result")
        } catch (e: Exception) {
            println("Eroare: ${e.message}")
        }
    }
    // Pornim firul
    thread.start()

    // Dacă trebuie să obțineți rezultatul în firul UI
    // Handler(Looper.getMainLooper()).post {
    //    // Actualizare UI
    // }
}

O abordare modernă alternativă este utilizarea corutinelor cu dispatcher-ii blocanți (deși acest lucru poate să nu fie cea mai bună opțiune pentru firul UI).

import kotlinx.coroutines.*

suspend fun performBlockingCoroutineOperation(): String {
    // Simulare a unei operații lungi
    delay(2000)
    return "Rezultatul din coroutine"
}

fun runBlockingCoroutine() {
    // Pornirea unei coroutine blocante
    runBlocking {
        try {
            val result = performBlockingCoroutineOperation()
            println("Rezultatul din coroutine: $result")
        } catch (e: Exception) {
            println("Eroare în coroutine: ${e.message}")
        }
    }
}

Este important să evitați apelurile blocante în firul principal UI (Main Thread) pentru a preveni ANR (Application Not Responding).