Sobes.tech
Middle

Чӣ гуна танзим ва истифодаи корутинҳоро дар лоиҳаҳои 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 лозим бошад)
}

Истифодаи корутинҳо дарбар мегирад:

  1. Ҳудуди ҳаёт (Scope): Ҳудуди корутинҳоро муайян мекунад ва ҳаёти онҳоро идора мекунад.

    • GlobalScope: Ҳудуди тамоми барнома, бояд бо эҳтиёт истифода шавад, зеро метавонад ба ҷасади хотира оварда расонад.
    • CoroutineScope: Ба таври равшан сохта мешавад, имкон медиҳад, ки корутинҳоро қатъ кардан мумкин аст.
    • Ҳудудҳои пешфарз дар рамзҳо (масалан, lifecycleScope дар ViewModel-и Android).
    // Мисол бо CoroutineScope
    val myScope = CoroutineScope(Dispatchers.Default + SupervisorJob()) // Сохтани ҳудуд бо Dispatcher ва Job
    
    fun performBackgroundTask() {
        myScope.launch { // Идоракунии корутин
            // Процеси дарозро ҳисоб кунед
        }
    }
    
    fun cancelAllTasks() {
        myScope.cancel() // Қатъ кардани ҳамаи корутинҳо дар ҳудуд
    }
    
  2. Сохтани корутинҳо (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!")
        }
    }
    
  3. Диспетчерҳо (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) // Чекор кардани анҷоми корутинҳо
    }
    
  4. Функсияҳои дар ҳолати пауза (Suspending functions): Функсияҳо, ки бо калидвожа suspend ишора шудаанд, ки метавонанд дар ҳолати пауза қарор гиранд ва бори дигар фаъол гарданд, бидуни бастани тӯл. Мегузаранд, ки танҳо аз дигар функсияҳои дар ҳолати пауза қароргирифта ё аз блоки корутин даъват шаванд.

  5. Таҳлили бекоршавӣ ва истисноҳо: Корутинҳо дастгирӣ мекунанд, ки структураи бекоршавӣ ва паҳншавии истисноҳоро.

    • Бекоршавӣ:
      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() // интизор шудан барои анҷом ёфтани
    }