Sobes.tech
Middle+

Hoe synchroniseer je coroutines in Android?

sobes.tech AI

Antwoord van AI

Om coroutines in Android te synchroniseren, kunnen verschillende benaderingen worden gebruikt, afhankelijk van de specifieke taak:

  • Join: Wachten tot een andere coroutine is voltooid.

    // Eerste coroutine starten
    val job1 = CoroutineScope(Dispatchers.Default).launch {
        delay(1000)
        println("Job 1 voltooid")
    }
    
    // Tweede coroutine starten
    val job2 = CoroutineScope(Dispatchers.Default).launch {
        delay(500)
        println("Job 2 voltooid")
    }
    
    // Wachten tot beide coroutines klaar zijn
    job1.join()
    job2.join()
    
    println("Alle jobs voltooid")
    
  • Await: Wachten op het resultaat van een asynchrone operatie weergegeven door Deferred.

    // Asynchrone operatie die een resultaat teruggeeft
    val deferredResult = CoroutineScope(Dispatchers.Default).async {
        delay(1000)
        "Resultaat van async"
    }
    
    // Resultaat afwachten
    val result = deferredResult.await()
    println(result)
    
  • CoroutineScope.coroutineScope: Een nieuwe scope creëren die pas eindigt nadat alle kind-coroutines zijn voltooid. Handig voor gestructureerde gelijktijdigheid.

    suspend fun doParallelWork() {
        coroutineScope { // Nieuwe gestructureerde concurrency scope maken
            launch { delay(1000); println("Taak 1 voltooid") }
            launch { delay(500); println("Taak 2 voltooid") }
        } // Dit punt wordt alleen bereikt na het voltooien van taak 1 en taak 2
        println("Alle parallelle taken voltooid")
    }
    
  • Semantiek van actoren (Channel): Voor berichtuitwisseling en synchronisatie van toegang tot wijzigbare gegevens tussen coroutines.

    // Een kanaal maken voor het uitwisselen van Int
    val channel = Channel<Int>()
    
    CoroutineScope(Dispatchers.Default).launch {
        // Gegevens naar kanaal sturen
        for (i in 1..5) {
            channel.send(i)
        }
        channel.close() // Kanaal sluiten na verzending
    }
    
    CoroutineScope(Dispatchers.Default).launch {
        // Gegevens uit kanaal ontvangen
        for (value in channel) {
            println("Ontvangen $value")
        }
    }
    
  • Mutex: Om exclusieve toegang tot een gedeelde bron te garanderen.

    import kotlinx.coroutines.sync.Mutex
    import kotlinx.coroutines.sync.withLock
    
    val mutex = Mutex()
    var counter = 0
    
    suspend fun incrementCounter() {
        mutex.withLock { // Mutex verkrijgen
            counter++
            // Mutex wordt automatisch vrijgegeven bij het verlaten van het blok
        }
    }
    

De keuze van de methode hangt af van wat precies gesynchroniseerd moet worden: wachten op voltooiing, resultaat verkrijgen, beheer van parallelle taken, gegevensuitwisseling of exclusieve toegang. coroutineScope wordt standaard aanbevolen voor gestructureerde gelijktijdigheid.