Sobes.tech
Junior

Hoe voer je synchronische code uit en krijg je het resultaat?

sobes.tech AI

Antwoord van AI

Je kunt een blokkerende oproep gebruiken in een aparte thread, bijvoorbeeld via Thread of AsyncTask (hoewel deze laatste verouderd is).

// Voorbeeld met Thread
fun performBlockingOperation(): String {
    // Simulatie van een lange operatie
    Thread.sleep(2000)
    return "Resultaat van de synchronisatie-operatie"
}

fun runSynchronousCode() {
    // Maak een nieuwe thread
    val thread = Thread {
        try {
            val result = performBlockingOperation()
            // Het resultaat kan worden teruggegeven aan de hoofdthread
            // via Handler of runOnUiThread
            println("Ontvangen resultaat: $result")
        } catch (e: Exception) {
            println("Fout: ${e.message}")
        }
    }
    // Start de thread
    thread.start()

    // Als je het resultaat in de UI-thread wilt krijgen
    // Handler(Looper.getMainLooper()).post {
    //    // UI bijwerken
    // }
}

Een moderne alternatieve aanpak is het gebruik van coroutines met blokkerende dispatchers (hoewel dit mogelijk niet de beste optie is voor de UI-thread).

import kotlinx.coroutines.*

suspend fun performBlockingCoroutineOperation(): String {
    // Simulatie van een lange operatie
    delay(2000)
    return "Resultaat van de coroutine"
}

fun runBlockingCoroutine() {
    // Start een blokkerende coroutine
    runBlocking {
        try {
            val result = performBlockingCoroutineOperation()
            println("Resultaat uit de coroutine: $result")
        } catch (e: Exception) {
            println("Fout in de coroutine: ${e.message}")
        }
    }
}

Het is belangrijk om blokkerende oproepen in de hoofd-UI-thread te vermijden om ANR (Application Not Responding) te voorkomen.