Чӣ гуна корутинҳоро дар Android ҳамоҳанг кардан мумкин аст?
sobes.tech AI
Ҷавоб аз AI
Барои ҳамоҳангсозии корутинҳо дар Android метавонед чанд роҳро истифода баред, вобаста ба вазифаи мушаххас:
-
Join: интизор шудан барои анҷоми кори дигар корутина.
// Иҷрои аввалин корутина val job1 = CoroutineScope(Dispatchers.Default).launch { delay(1000) println("Корутина 1 анҷом ёфт") } // Иҷрои дуввум корутина val job2 = CoroutineScope(Dispatchers.Default).launch { delay(500) println("Корутина 2 анҷом ёфт") } // интизор шудан барои анҷоми ҳар ду корутина job1.join() job2.join() println("Ҳамаи корҳо анҷом ёфт") -
Await: интизор шудан барои натиҷаи амалиёти асинхронии, ки Deferred-ро намояндагӣ мекунад.
// Амалиёти асинхронии, ки натиҷа медиҳад val deferredResult = CoroutineScope(Dispatchers.Default).async { delay(1000) "Натиҷаи аз async" } // интизор шудан барои натиҷа val result = deferredResult.await() println(result) -
CoroutineScope.coroutineScope: Таҳия кардани минтақаи нави назорат, ки танҳо пас аз анҷоми ҳамаи корутинаҳои зерини он ба охир мерасад. Барои рақобати сохторӣ муфид аст.
suspend fun doParallelWork() { coroutineScope { // Таҳия кардани соҳаи нави рақобат launch { delay(1000); println("Корутина 1 анҷом ёфт") } launch { delay(500); println("Корутина 2 анҷом ёфт") } } // Ин нуқта танҳо пас аз анҷоми корутинаҳои 1 ва 2 ба даст меояд println("Ҳамаи корҳои параллелӣ анҷом ёфт") } -
Семантикаи каналҳо (Channel): Барои мубодилаи паёмҳо ва ҳамоҳангсозии дастрасӣ ба маълумоти тағйирёбанда байни корутинҳо.
// Таҳия кардани канал барои мубодилаи Int val channel = Channel<Int>() CoroutineScope(Dispatchers.Default).launch { // Иҷрои маълумот ба канал for (i in 1..5) { channel.send(i) } channel.close() // Баста кардани канал пас аз ирсол } CoroutineScope(Dispatchers.Default).launch { // гирифтани маълумот аз канал for (value in channel) { println("Пас аз гирифтани $value") } } -
Mutex: Барои таъмин кардани дастрасии эксклюзивӣ ба манбаи умумӣ.
import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock val mutex = Mutex() var counter = 0 suspend fun incrementCounter() { mutex.withLock { // гирифтани mutex counter++ } }
Интихоби усул вобаста аст, ки чӣ бояд ҳамоҳангсозӣ шавад: интизор шудан барои анҷом, гирифтани натиҷа, идоракунии вазифаҳои параллелӣ, мубодилаи маълумот ё дастрасии эксклюзивӣ. coroutineScope ҳамчун роҳи тавсияшуда барои рақобати сохторӣ истифода мешавад.