CodeBlanks Logo Icon CodeBlanks

flowOn

flowOn ile Flow bağlam değişimi öğrenirsin.

flowOn: Bağlam değiştirme

flowOn(dispatcher) akışın yukarı tarafının çalıştığı coroutine bağlamını belirler. Yukarı taraf: flowOn'dan önceki kurucu ve ara operatörler. collect çağıranın bağlamında çalışmaya devam eder.

fun numbers(): Flow<Int> = flow {
    for (i in 1..3) emit(i)
}

fun main() = runBlocking {
    numbers()
        .flowOn(Dispatchers.IO)
        .collect { println(it) }
}

Dispatchers.IO dosya/ağ gibi G/Ç işleri için, Dispatchers.Default CPU işleri için önerilir. Değerlerin sırası korunur; yalnızca emit'in çalıştığı iş parçacığı değişir.

Yukarı taraf kavramı

flowOn'un konumu önemlidir: yalnızca kendisinden önceki kısmı etkiler. Yani kurucu (flow { }) ve ara operatörler (map, filter) belirtilen bağlamda çalışır. collect ise çağıranın bağlamında kalır.

numbers()
    .map { it * 2 }      // flowOn bağlamında
    .flowOn(Dispatchers.Default)
    .collect { println(it) }  // runBlocking bağlamında

Değerlerin sırası ve içerikleri korunur; yalnızca hesaplama yerini değiştirirsin. Bu, ağ çağrısı veya dosya okuması gibi yavaş işleri UI iş parçacığından uzak tutmak için kullanışlıdır.

Uygulama flowOn ile bağlam belirle

fun numbers(): Flow<Int> = flow { ... } tanımla. Gövdede for (i in 1..3) ile emit(i) çağrısı yapsın. main'i runBlocking ile işaretle. İçinde numbers().flowOn(Dispatchers.IO).collect { println(it) } çağrısı yapsın. Çıktı her değeri ayrı satırda yazdırır.

Başlangıç kodu

Main.kt
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*

// numbers fonksiyonu: flow { } içinde 1, 2, 3 değerlerini emit etsin
// main: numbers akışına IO dispatcher uygula, topla ve yazdır
fun main() = runBlocking {
    // buraya yaz
}

Örnek çözüm

Main.kt
fun numbers(): Flow<Int> = flow {
    for (i in 1..3) {
        emit(i)
    }
}

fun main() = runBlocking {
    numbers().flowOn(Dispatchers.IO).collect { println(it) }
}

Beklenen çıktı

1
2
3

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Bağlam değiştirme

Soru
numbers().____(Dispatchers.IO).collect { println(it) }
Cevap
numbers().flowOn(Dispatchers.IO).collect { println(it) }

Açıklama: flowOn, yukarı tarafın çalıştığı bağlamı belirler.

2 flow.flowOn(Dispatchers.IO) neyi değiştirir?

  • Akışın değer türünü
  • collect çağrısının bağlamını
  • Akışın yukarı tarafının çalıştığı bağlamı Doğru cevap
  • Akışın soğuk doğasını

Açıklama: flowOn, yukarı tarafın (kurucu ve ara operatörler) bağlamını belirler.

3 Bağlam ve dispatcher eşle

Kavram Anlamı
flowOn Bağlam belirler
Dispatchers.IO G/Ç işleri
Dispatchers.Default CPU işleri
upstream Yukarı taraf

Orta seviye bölümündeki tüm dersler