flowOn
- Kotlin kursu
- Orta seviye
- Ders 92/116
- 5 dk
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ındaDeğ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
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
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
numbers().____(Dispatchers.IO).collect { println(it) }
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 |