Hogyan szinkronizáljuk a korutinokat Androiden?
sobes.tech MI
Válasz az MI-től
Az Androidban a korutinok szinkronizálására több megközelítés is létezik, a konkrét feladattól függően:
-
Join: Egy másik korutina befejezésének várása.
// Az első korutina indítása val job1 = CoroutineScope(Dispatchers.Default).launch { delay(1000) println("Job 1 kész") } // A második korutina indítása val job2 = CoroutineScope(Dispatchers.Default).launch { delay(500) println("Job 2 kész") } // Mindkét korutina befejezésének várása job1.join() job2.join() println("Minden munka kész") -
Await: Egy aszinkron művelet eredményének várása, amit Deferred reprezentál.
// Aszinkron művelet, ami eredményt ad vissza val deferredResult = CoroutineScope(Dispatchers.Default).async { delay(1000) "Eredmény az async-ból" } // Eredmény várása val result = deferredResult.await() println(result) -
CoroutineScope.coroutineScope: Egy új hatókör létrehozása, ami csak az összes gyermekkorutina befejezése után ér véget. Strukturált konkurencia esetén hasznos.
suspend fun doParallelWork() { coroutineScope { // Új strukturált konkurencia hatókör létrehozása launch { delay(1000); println("Feladat 1 kész") } launch { delay(500); println("Feladat 2 kész") } } // Ez a pont csak akkor érhető el, ha a feladat 1 és 2 befejeződött println("Minden párhuzamos feladat kész") } -
Aktorok szemiantikája (Channel): Üzenetcsere és hozzáférés szinkronizálása módosítható adatokhoz korutinok között.
// Létrehozunk egy csatornát az Int típushoz val channel = Channel<Int>() CoroutineScope(Dispatchers.Default).launch { // Adatok küldése a csatornára for (i in 1..5) { channel.send(i) } channel.close() // A csatorna bezárása küldés után } CoroutineScope(Dispatchers.Default).launch { // Adatok fogadása a csatornáról for (value in channel) { println("Kaptam $value") } } -
Mutex: A közös erőforrás exkluzív hozzáférésének biztosítása.
import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock val mutex = Mutex() var counter = 0 suspend fun incrementCounter() { mutex.withLock { // Mutex megszerzése counter++ // A mutex automatikusan felszabadul, amikor kilépünk a blokkból } }
A módszer kiválasztása attól függ, pontosan mit kell szinkronizálni: a befejezést, eredményt, párhuzamos feladatokat, adatok cseréjét vagy exkluzív hozzáférést. A coroutineScope az alapértelmezett ajánlott megközelítés strukturált konkurencia esetén.