Sobes.tech
Middle+

Kako sinhronizovati korutine u Androidu?

sobes.tech АИ

Одговор од АИ

Za sinhronizaciju korutina u Androidu možete koristiti nekoliko pristupa u zavisnosti od konkretne zadatka:

  • Join: Čekanje na završetak druge korutine.

    // Pokrećemo prvu korutinu
    val job1 = CoroutineScope(Dispatchers.Default).launch {
        delay(1000)
        println("Job 1 gotov")
    }
    
    // Pokrećemo drugu korutinu
    val job2 = CoroutineScope(Dispatchers.Default).launch {
        delay(500)
        println("Job 2 gotov")
    }
    
    // Čekamo na završetak obe korutine
    job1.join()
    job2.join()
    
    println("Sve poslove završeno")
    
  • Await: Čekanje na rezultat asinhrone operacije predstavljene Deferred.

    // Asinhrona operacija koja vraća rezultat
    val deferredResult = CoroutineScope(Dispatchers.Default).async {
        delay(1000)
        "Rezultat iz async" 
    }
    
    // Čekamo rezultat
    val result = deferredResult.await()
    println(result)
    
  • CoroutineScope.coroutineScope: Kreiranje nove oblasti vidljivosti koja će se završiti tek nakon završetka svih podređenih korutina. Korisno za strukturiranu konkurenciju.

    suspend fun doParallelWork() {
        coroutineScope { // Kreiramo novu struktuisanu konkurenciju
            launch { delay(1000); println("Zadatak 1 gotov") }
            launch { delay(500); println("Zadatak 2 gotov") }
        } // Ova tačka će biti dostignuta tek nakon završetka zadataka 1 i 2
        println("Sve paralelne zadatke završeno")
    }
    
  • Semantika aktora (Channel): Za razmenu poruka i sinhronizaciju pristupa promenljivim podacima između korutina.

    // Kreiramo kanal za razmenu Int
    val channel = Channel<Int>()
    
    CoroutineScope(Dispatchers.Default).launch {
        // Šaljemo podatke u kanal
        for (i in 1..5) {
            channel.send(i)
        }
        channel.close() // Zatvaramo kanal nakon slanja
    }
    
    CoroutineScope(Dispatchers.Default).launch {
        // Primamo podatke iz kanala
        for (value in channel) {
            println("Primljeno $value")
        }
    }
    
  • Mutex: Za obezbeđivanje ekskluzivnog pristupa zajedničkom resursu.

    import kotlinx.coroutines.sync.Mutex
    import kotlinx.coroutines.sync.withLock
    
    val mutex = Mutex()
    var counter = 0
    
    suspend fun incrementCounter() {
        mutex.withLock { // Zauzimamo mutex
            counter++
        }
    }
    

Izbor metode zavisi od toga šta je tačno potrebno sinhronizovati: čekanje na završetak, dobijanje rezultata, upravljanje paralelnim zadacima, razmena podataka ili ekskluzivni pristup. coroutineScope je preporučeni pristup po defaultu za strukturiranu konkurenciju.