Чӣ гуна танзим ва истифодаи корутинҳоро дар лоиҳаҳои Kotlin кардан мумкин аст?
sobes.tech AI
Ҷавоб аз AI
Барои танзими корутинҳо, бояд вобастагии мувофиқро ба файли build.gradle илова кунед.
// build.gradle (модул иловагӣ)
dependencies {
//... дигар вобастагиҳо
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3") // барои JVM, Android, JS, Native
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3") // барои Android (агар Dispatchers.Main лозим бошад)
}
Истифодаи корутинҳо дарбар мегирад:
-
Ҳудуди ҳаёт (Scope): Ҳудуди корутинҳоро муайян мекунад ва ҳаёти онҳоро идора мекунад.
GlobalScope: Ҳудуди тамоми барнома, бояд бо эҳтиёт истифода шавад, зеро метавонад ба ҷасади хотира оварда расонад.CoroutineScope: Ба таври равшан сохта мешавад, имкон медиҳад, ки корутинҳоро қатъ кардан мумкин аст.- Ҳудудҳои пешфарз дар рамзҳо (масалан,
lifecycleScopeдар ViewModel-и Android).
// Мисол бо CoroutineScope val myScope = CoroutineScope(Dispatchers.Default + SupervisorJob()) // Сохтани ҳудуд бо Dispatcher ва Job fun performBackgroundTask() { myScope.launch { // Идоракунии корутин // Процеси дарозро ҳисоб кунед } } fun cancelAllTasks() { myScope.cancel() // Қатъ кардани ҳамаи корутинҳо дар ҳудуд } -
Сохтани корутинҳо (Builders): Функсияҳо барои оғоз кардани корутинҳо.
launch: Корутинро оғоз мекунад, ки натиҷаи равшан намедиҳад (Job).async: Корутинро оғоз мекунад, ки натиҷаро дар шаклиDeferredбармегардонад.
import kotlinx.coroutines.* suspend fun fetchData() = coroutineScope { // coroutineScope - сохтани барои рақобати сохторӣ val data1 = async { networkCall1() } // async Deferred-ро бармегардонад val data2 = async { networkCall2() } // ... коркарди маълумот пас аз гирифтани онҳо data1.await() // Гирифтани натиҷа аз Deferred, корутина дар хоб меравад то анҷом ёфтани data2.await() } suspend fun networkCall1(): String { delay(1000) // Имитатсияи дархости шабакавӣ return "Data 1" } suspend fun networkCall2(): String { delay(1500) return "Data 2" } fun startFetching() = runBlocking { // runBlocking - сохтани барои бастани ҷараёни ҳозира (масалан, main ё тестҳо) launch { // launch натиҷаро бармегардонад Job println("Fetching data...") fetchData() println("Data fetched!") } } -
Диспетчерҳо (Dispatchers): Муайян мекунанд, ки корутин дар кадом тӯл ё пуле аз тӯлҳо иҷро мешавад.
Dispatchers.Default: Барои вазифаҳои CPU-сангин.Dispatchers.IO: Барои амалиётҳои блокирии I/O (файлҳо, шабака).Dispatchers.Main: Тӯли асосӣ (фақат барои Android ва Swing/JavaFX).Dispatchers.Unconfined: Корутинро дар тӯли даъваткунанда оғоз мекунад, пас хоб меравад ва пас аз он дар тӯли, ки онро такмил дод, идома медиҳад.
import kotlinx.coroutines.* fun simpleTask() { GlobalScope.launch(Dispatchers.IO) { // Муайян кардани диспетчер // Иҷрои амалиёти I/O println("Running on thread: ${Thread.currentThread().name}") } } fun main() = runBlocking { launch(Dispatchers.Default) { println("Default thread: ${Thread.currentThread().name}") } launch(Dispatchers.Unconfined) { println("Unconfined thread 1: ${Thread.currentThread().name}") delay(100) // Хоб println("Unconfined thread 2: ${Thread.currentThread().name}") // Идома дар тӯли дигар (шояд) } delay(200) // Чекор кардани анҷоми корутинҳо } -
Функсияҳои дар ҳолати пауза (Suspending functions): Функсияҳо, ки бо калидвожа
suspendишора шудаанд, ки метавонанд дар ҳолати пауза қарор гиранд ва бори дигар фаъол гарданд, бидуни бастани тӯл. Мегузаранд, ки танҳо аз дигар функсияҳои дар ҳолати пауза қароргирифта ё аз блоки корутин даъват шаванд. -
Таҳлили бекоршавӣ ва истисноҳо: Корутинҳо дастгирӣ мекунанд, ки структураи бекоршавӣ ва паҳншавии истисноҳоро.
- Бекоршавӣ:
import kotlinx.coroutines.* fun cancellableTask() = GlobalScope.launch { try { repeat(1000) { i -> println("Working $i ...") delay(100) // функсияи дар ҳолати паузаи, ки эҳтиром мекунад бекоршавиро } } catch (e: CancellationException) { println("Task was cancelled!") } finally { println("Cleaning up...") } } fun main() = runBlocking { val job = cancellableTask() delay(500) // Чекор кардан job.cancelAndJoin() // Бекор кардан ва интизор шудан барои анҷом ёфтани } - Истисноҳо: Дар ҳолати
launch, истиснои беэҳтиёт ба барнома фалаҷ меорад (аз пешфарз дар Android). Дар ҳолатиasync, истисно дар вақти даъватиawait()ба вуҷуд меояд. Барои назорати бештар истифода мешавандCoroutineExceptionHandlerёSupervisorJob.
import kotlinx.coroutines.* fun main() = runBlocking { val handler = CoroutineExceptionHandler { _, exception -> println("Caught exception: $exception") } val job = GlobalScope.launch(handler) { // Истифодаи коркарди истисно throw IllegalStateException("Something went wrong") } job.join() // интизор шудан барои анҷом ёфтани } - Бекоршавӣ: