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.