Sobes.tech
Middle+

Jak synchronizovat korutiny v Androidu?

sobes.tech AI

Odpověď od AI

Pro synchronizaci korutin v Androidu lze použít několik přístupů v závislosti na konkrétním úkolu:

  • Join: Čekání na dokončení jiné korutiny.

    // Spouštíme první korutinu
    val job1 = CoroutineScope(Dispatchers.Default).launch {
        delay(1000)
        println("Job 1 hotovo")
    }
    
    // Spouštíme druhou korutinu
    val job2 = CoroutineScope(Dispatchers.Default).launch {
        delay(500)
        println("Job 2 hotovo")
    }
    
    // Čekáme na dokončení obou korutin
    job1.join()
    job2.join()
    
    println("Všechny úkoly hotovo")
    
  • Await: Čekání na výsledek asynchronní operace reprezentované Deferred.

    // Asynchronní operace vracející výsledek
    val deferredResult = CoroutineScope(Dispatchers.Default).async {
        delay(1000)
        "Výsledek z async"
    }
    
    // Čekáme na výsledek
    val result = deferredResult.await()
    println(result)
    
  • CoroutineScope.coroutineScope: Vytvoření nové oblasti viditelnosti, která skončí až po dokončení všech podřízených korutin. Užitečné pro strukturovanou konkurenci.

    suspend fun doParallelWork() {
        coroutineScope { // Vytváříme novou strukturovanou konkurenční oblast
            launch { delay(1000); println("Úkol 1 hotovo") }
            launch { delay(500); println("Úkol 2 hotovo") }
        } // Tento bod bude dosažen až po dokončení úkolu 1 a úkolu 2
        println("Všechny paralelní úkoly hotovo")
    }
    
  • Semantika aktorů (Channel): Pro výměnu zpráv a synchronizaci přístupu ke změnitelným datům mezi korutinami.

    // Vytváříme kanál pro výměnu Int
    val channel = Channel<Int>()
    
    CoroutineScope(Dispatchers.Default).launch {
        // Odesíláme data do kanálu
        for (i in 1..5) {
            channel.send(i)
        }
        channel.close() // Uzavření kanálu po odeslání
    }
    
    CoroutineScope(Dispatchers.Default).launch {
        // Přijímáme data z kanálu
        for (value in channel) {
            println("Přijato $value")
        }
    }
    
  • Mutex: Pro zajištění exkluzivního přístupu ke sdílenému zdroji.

    import kotlinx.coroutines.sync.Mutex
    import kotlinx.coroutines.sync.withLock
    
    val mutex = Mutex()
    var counter = 0
    
    suspend fun incrementCounter() {
        mutex.withLock { // Získání mutexu
            counter++
            // Mutex bude automaticky uvolněn při opuštění bloku
        }
    }
    

Volba metody závisí na tom, co přesně je potřeba synchronizovat: čekání na dokončení, získání výsledku, řízení paralelních úkolů, výměnu dat nebo exkluzivní přístup. coroutineScope je doporučený přístup jako výchozí pro strukturovanou konkurenci.