Sobes.tech
Middle+

Ako synchronizovať korutiny v Android?

sobes.tech AI

Odpoveď od AI

Pre synchronizácie korutín v Android môžete použiť niekoľko prístupov v závislosti od konkrétnej úlohy:

  • Join: Čakanie na dokončenie inej korutiny.

    // Spúšťame prvú korutinu
    val job1 = CoroutineScope(Dispatchers.Default).launch {
        delay(1000)
        println("Job 1 hotovo")
    }
    
    // Spúšťame druhú korutinu
    val job2 = CoroutineScope(Dispatchers.Default).launch {
        delay(500)
        println("Job 2 hotovo")
    }
    
    // Čakáme na dokončenie oboch korutín
    job1.join()
    job2.join()
    
    println("Všetky úlohy hotové")
    
  • Await: Čakanie na výsledok asynchrónnej operácie reprezentovanej Deferred.

    // Asynchrónna operácia, ktorá vracia výsledok
    val deferredResult = CoroutineScope(Dispatchers.Default).async {
        delay(1000)
        "Výsledok z async"
    }
    
    // Čakáme na výsledok
    val result = deferredResult.await()
    println(result)
    
  • CoroutineScope.coroutineScope: Vytvorenie novej oblasti viditeľnosti, ktorá skončí až po dokončení všetkých dcérskych korutín. Užitečné pre štruktúrovanú konkurenciu.

    suspend fun doParallelWork() {
        coroutineScope { // Vytvárame novú štruktúrovanú konkurenciu
            launch { delay(1000); println("Úloha 1 hotová") }
            launch { delay(500); println("Úloha 2 hotová") }
        } // Tento bod bude dosiahnutý až po dokončení úlohy 1 a úlohy 2
        println("Všetky paralelné úlohy hotové")
    }
    
  • Semantika aktérov (Channel): Pre výmenu správ a synchronizáciu prístupu k meniteľným dátam medzi korutinami.

    // Vytvárame kanál pre výmenu Int
    val channel = Channel<Int>()
    
    CoroutineScope(Dispatchers.Default).launch {
        // Odosielame dáta do kanála
        for (i in 1..5) {
            channel.send(i)
        }
        channel.close() // Zatvárame kanál po odoslaní
    }
    
    CoroutineScope(Dispatchers.Default).launch {
        // Prijímame dáta z kanála
        for (value in channel) {
            println("Prijaté $value")
        }
    }
    
  • Mutex: Pre zabezpečenie exkluzívneho prístupu ku spoločnému zdroju.

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

Voľba metódy závisí od toho, čo presne je potrebné synchronizovať: čakanie na dokončenie, získanie výsledku, riadenie paralelných úloh, výmenu dát alebo exkluzívny prístup. coroutineScope je odporúčaný prístup ako predvolený pre štruktúrovanú konkurenciu.