Sobes.tech
Middle+

Android'de korutinleri nasıl senkronize edilir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Android'de koroutinleri senkronize etmek için, belirli göreve bağlı olarak birkaç yaklaşım kullanılabilir:

  • Join: Başka bir korutinanın tamamlanmasını beklemek.

    // İlk korutina başlatılır
    val job1 = CoroutineScope(Dispatchers.Default).launch {
        delay(1000)
        println("İş 1 tamamlandı")
    }
    
    // İkinci korutina başlatılır
    val job2 = CoroutineScope(Dispatchers.Default).launch {
        delay(500)
        println("İş 2 tamamlandı")
    }
    
    // Her iki korutina tamamlanana kadar bekle
    job1.join()
    job2.join()
    
    println("Tüm işler tamamlandı")
    
  • Await: Deferred ile temsil edilen asenkron işlemin sonucunu beklemek.

    // Sonuç döndüren asenkron işlem
    val deferredResult = CoroutineScope(Dispatchers.Default).async {
        delay(1000)
        "Async'ten sonuç"
    }
    
    // Sonucu bekle
    val result = deferredResult.await()
    println(result)
    
  • CoroutineScope.coroutineScope: Sadece tüm alt korutinler tamamlandıktan sonra sona erecek yeni bir alan oluşturmak. Yapılandırılmış eşzamanlılık için kullanışlı.

    suspend fun doParallelWork() {
        coroutineScope { // Yeni yapılandırılmış eşzamanlılık kapsamı oluştur
            launch { delay(1000); println("Görev 1 tamamlandı") }
            launch { delay(500); println("Görev 2 tamamlandı") }
        } // Bu nokta, görev 1 ve görev 2 tamamlandıktan sonra ulaşılır
        println("Tüm paralel görevler tamamlandı")
    }
    
  • Aktörlerin semantiği (Channel): Mesaj alışverişi ve korutinler arasında değiştirilebilir verilere erişim senkronizasyonu için.

    // Int alışverişi için kanal oluştur
    val channel = Channel<Int>()
    
    CoroutineScope(Dispatchers.Default).launch {
        // Kanal aracılığıyla veri gönder
        for (i in 1..5) {
            channel.send(i)
        }
        channel.close() // Gönderim sonrası kanalı kapat
    }
    
    CoroutineScope(Dispatchers.Default).launch {
        // Kanaldan veri al
        for (value in channel) {
            println("Alındı $value")
        }
    }
    
  • Mutex: Ortak kaynağa özel erişimi sağlamak için.

    import kotlinx.coroutines.sync.Mutex
    import kotlinx.coroutines.sync.withLock
    
    val mutex = Mutex()
    var counter = 0
    
    suspend fun incrementCounter() {
        mutex.withLock { // Mutex'i al
            counter++
            // Mutex, bloktan çıkarken otomatik olarak serbest bırakılır
        }
    }
    

Yöntem seçimi, tam olarak neyin senkronize edilmesi gerektiğine bağlıdır: tamamlanmayı beklemek, sonucu almak, paralel görevleri yönetmek, veri alışverişi yapmak veya özel erişim sağlamak. coroutineScope, yapılandırılmış eşzamanlılık için varsayılan olarak önerilen yaklaşımdır.