Sobes.tech
Middle+

Kā sinhronizēt korutinas Android?

sobes.tech AI

Atbilde no AI

Android korutīnu sinhronizācijai var izmantot vairākus pieejas, atkarībā no konkrētā uzdevuma:

  • Join: gaidīt citas korutīnas pabeigšanu:

    // Pirmās korutīnas palaišana
    val job1 = CoroutineScope(Dispatchers.Default).launch {
        delay(1000)
        println("Darbs 1 pabeigts")
    }
    
    // Otrās korutīnas palaišana
    val job2 = CoroutineScope(Dispatchers.Default).launch {
        delay(500)
        println("Darbs 2 pabeigts")
    }
    
    // Gaidīt abu korutīnu pabeigšanu
    job1.join()
    job2.join()
    
    println("Visi darbi pabeigti")
    
  • Await: gaidīt asinhronas operācijas rezultātu, kas ir Deferred:

    // Asinhrona operācija, kas atgriež rezultātu
    val deferredResult = CoroutineScope(Dispatchers.Default).async {
        delay(1000)
        "Rezultāts no async"
    }
    
    // Gaidīt rezultātu
    val result = deferredResult.await()
    println(result)
    
  • CoroutineScope.coroutineScope: izveidot jaunu redzamības lauku, kas beidzas tikai pēc visu bērnu korutīnu pabeigšanas. Noder strukturētai konkurencei:

    suspend fun doParallelWork() {
        coroutineScope { // izveidot jaunu strukturētu konkurences lauku
            launch { delay(1000); println("Uzdevums 1 pabeigts") }
            launch { delay(500); println("Uzdevums 2 pabeigts") }
        } // Šī vieta tiks sasniegta tikai pēc uzdevumu 1 un 2 pabeigšanas
        println("Visi paralēlie uzdevumi pabeigti")
    }
    
  • Aktoru semantika (Channel): ziņojumu apmaiņai un piekļuves sinhronizācijai maināmiem datiem starp korutīnām:

    // Izveidot kanālu Int apmaiņai
    val channel = Channel<Int>()
    
    CoroutineScope(Dispatchers.Default).launch {
        // Nosūtīt datus uz kanāla
        for (i in 1..5) {
            channel.send(i)
        }
        channel.close() // aizvērt kanālu pēc sūtīšanas
    }
    
    CoroutineScope(Dispatchers.Default).launch {
        // Saņemt datus no kanāla
        for (value in channel) {
            println("Saņemts $value")
        }
    }
    
  • Mutex: nodrošināt ekskluzīvu piekļuvi kopīgam resursam:

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

Izvēle ir atkarīga no tā, ko tieši nepieciešams sinhronizēt: gaidīt pabeigšanu, saņemt rezultātu, pārvaldīt paralēlas uzdevumus, apmainīties ar datiem vai nodrošināt ekskluzīvu piekļuvi. coroutineScope ir ieteicamais pieejas veids strukturētai konkurencei pēc noklusējuma.