Kotlin Flows ve LiveData

Begum Avci Kocaman
Huawei Developers - Türkiye
5 min readSep 27, 2023
Kotlin Flows and LiveData

Giriş

Herkese merhabaö bu makalede flowlar, stateflow , sharedflow ve live data kullanarak nasil kod yazabilecegimiz birbirleriyle benzer ve farkli ozellikleri hakkinda bilgiler verecegim.

Flow

Kotlin Flows, Kotlin programlama dilinin bir parçası olarak sunulan, reaktif programlama paradigmalarını destekleyen bir kütüphanedir. Flows, asenkron programlama için kullanılır ve özellikle veri akışı işlemlerini kolaylaştırır.

İşte Kotlin Flows’un temel kavramları ve özellikleri:

  1. Asenkron Programlama: Kotlin Flows, asenkron programlamaya odaklanır. Bu, uzun süre çalışan işlemleri engellemeden diğer işlemleri devam ettirebilmenizi sağlar. Özellikle arka planda çalışan işlemlerle etkileşimde bulunurken önemlidir.
  2. Veri Akışı (Stream) İşleme: Kotlin Flows, veri akışlarını temsil eder. Bu, bir dizi değerin ardışık olarak üretilip tüketilmesini sağlar. Örneğin, bir dosyadan satır satır okuma işlemi bir veri akışını temsil edebilir.
  3. Cold (Soğuk) Akışlar: Cold akışlar, bir akışın her abone olduğunda baştan başlayacağı anlamına gelir. Yani, her abone olduğunda veri üretimi yeniden başlar.
  4. Hot (Sıcak) Akışlar: Hot akışlar, bir akışın ne zaman başladığını ve ne zaman bittiğini takip etmez. Akışın başlatılması ve sonlandırılması dışsal faktörlere bağlıdır.
  5. Üretici (Producer) ve Tüketici (Consumer): Bir Flow, bir üretici ve bir veya daha fazla tüketiciye sahip olabilir. Üretici, veri üretir ve tüketici bu veriyi alır ve işler. Bu, çoklu aboneliklere izin verir.
  6. Akış İşleme Operatörleri: Kotlin Flows, bir dizi operatör sağlar. Bu operatörler, veri akışlarını işlemek ve dönüştürmek için kullanılır. Örneğin, map, filter, transform, collect gibi operatörler bulunur.
  7. Korutinlerle Entegrasyon: Kotlin Flows, korutinlerle entegre çalışır. Bu, akışların asenkron işlemleri kolayca yönetmesini sağlar. Ayrıca, akışlar korutinlerle birlikte çalışarak işlemlerin daha etkili olmasını sağlar.
  8. Dondurulabilir (Suspending) Fonksiyonlar: Flows, dondurulabilir işlevlerle çalışır. Bu, uzun süre çalışan işlemleri başlatırken ve beklerken akışın beklemesine izin verir.

Örnek bir Flow oluşturmak için, flow { ... } yapısını kullanabilirsiniz. Ayrıca, .asFlow() ile mevcut koleksiyonları veya dizileri bir Flow'a dönüştürebilirsiniz.

Örnek olarak, bir dosyadan satır satır okuma işlemi için bir Flow oluşturmak isterseniz:

Bu, bir Flow döndüren bir fonksiyon oluşturur. Bu Flow, her abone olduğunda baştan başlayacak ve dosyadan her bir satırı gönderecektir.

Kotlin Flows, asenkron programlama ve veri akışları ile çalışırken oldukça güçlü bir araçtır. Uzun süre çalışan işlemler, ağ istekleri, veritabanı işlemleri gibi senaryolarda kullanılır.

flow entities

Kotlin StateFlow

Kotlin’in reaktif programlama kütüphanelerinden biridir. StateFlow, değişen bir değeri gözlemlemek için kullanılır ve bu değeri akış olarak yayınlar. StateFlow, özellikle UI durumlarını yönetmek için kullanılır.

İşte Kotlin StateFlow’un temel kavramları ve özellikleri:

  1. Değişken Durum (State): StateFlow, bir değişken durumu temsil eder. Bu durum, zamanla değişebilir ve bu değişikliklerin abonelere iletilmesini sağlar.
  2. Mutable ve Immutable: StateFlow iki tür sunar: mutableStateOf ve stateIn. mutableStateOf ile durumu değiştirebilirsiniz, stateIn ile değiştiremezsiniz.
  3. Asenkron Değişiklikler: StateFlow, değeri değiştirmek ve bu değişikliği abonelere bildirmek için kullanılır. Değer her değiştiğinde, abonelere yeni değer gönderilir.
  4. Akış (Flow) ve StateFlow Arasındaki Fark: StateFlow, bir akıştır, ancak farkı, bir değeri temsil eder ve bu değer değiştiğinde abonelere bildirim gönderir. Yani, StateFlow, bir tek değer için kullanılırken, Flow birden çok değeri temsil eder.
  5. Lifecycle Bilinci: StateFlow, yaşam döngüsünü bilir ve uygun şekilde ele alınması durumunda sızıntıları önler.
  6. Abonelik ve İptal Etme: StateFlow, abone olduğunuzda değeri hemen gönderir. Aboneliği sonlandırdığınızda, artık değer değişiklikleri alınmaz.

Örnek bir Kotlin StateFlow kullanımı aşağıda gösterilmiştir:

Yukarıdaki örnekte, CounterViewModel sınıfı, _counter adında bir MutableStateFlow oluşturur. Bu _countercounter adında bir değiştirilemez (immutable) StateFlow'a dönüştürür. increment() fonksiyonu, _counter'ın mevcut değerini alır, 1 ekler ve bu değeri _counter'a geri yansıtarak durumun değişmesini sağlar.

Kullanımı:

Yukarıdaki kod, CounterViewModel'i oluşturur ve counter'ı gözlemler. increment() iki kez çağrıldığında, değer 1 artar ve bu değer gözlemciye (collect) iletilir. Bu durum, UI durumlarını yönetmek veya herhangi bir değişken durumu takip etmek için kullanışlıdır.

SharedFlow

Kotlin’in reaktif programlama kütüphanesinde yer alan SharedFlow, birden çok abonenin aynı değerleri almasını sağlar. StateFlow'dan farklı olarak, SharedFlow bir değeri her değiştirdiğinde tüm abonelere bu değeri iletilir.

İşte SharedFlow'un temel özellikleri:

  1. Birden Fazla Abone: SharedFlow, birden fazla abonenin aynı değerleri alabilmesini sağlar.
  2. Yayınlanan Değerlerin Bellekte Tutulması: SharedFlow, değerleri yayınladıktan sonra bellekte saklar. Abone olan yeni bir gözlemci, en son yayınlanan değeri anında alır.
  3. Hot Akış: SharedFlow bir tür "hot" akıştır, yani abonelik durumu başlamadan önce de değerler üretebilir.
  4. Lifecycle Bilinci: SharedFlow, yaşam döngüsünü bilir ve uygun şekilde ele alınması durumunda sızıntıları önler.
  5. Sıcaklık ve Soğukluk: SharedFlow, abonelik başlamadan önce de değerler yayınlayabilir. Bu, SharedFlow'un "sıcak" bir akış olduğu anlamına gelir. Diğer yandan, "soğuk" akışlar, abonelik başladıktan sonra değerler yayınlar.

Örnek bir Kotlin SharedFlow kullanımı aşağıda gösterilmiştir:

Yukarıdaki örnekte, MutableSharedFlow ile bir sharedFlow oluşturduk. Ardından, iki ayrı iş parçacığında (coroutine) iki farklı abone oluşturduk (job1 ve job2). Her iki abone de aynı değerleri alır.

Sonrasında, sharedFlow üzerinden emit yöntemi ile değerler yayınlanır. Her iki abone de yayınlanan değerleri anında alır.

Bu örnek, SharedFlow'un birden fazla abone tarafından aynı değerlerin alınmasını sağladığını göstermektedir.

LiveData:

Kotlin LiveData, Android uygulamalarında kullanılan bir yaşam döngüsü bilincine sahip veri tutucu sınıfıdır. LiveData, veri değişikliklerini dinleyen ve bu değişikliklere otomatik olarak tepki veren bileşenler arasında bir köprü görevi görür. Bu sayede UI (Kullanıcı Arayüzü) ve veri kaynağı (örneğin, veritabanı veya ağ hizmeti) arasındaki iletişim daha düzenli ve hatasız hale gelir.

İşte LiveData’nın temel özellikleri:

  1. Yaşam Döngüsü Bilinci: LiveData, Android bileşenlerinin (Activity, Fragment) yaşam döngüsünü otomatik olarak izler. Bu sayede, eğer bir bileşen aktif değilse, veri güncellemeleri alınmaz.
  2. UI Güncellemeleri: LiveData, veri değiştiğinde otomatik olarak UI’yi günceller. Bu, veri kaynağını dinlemek ve her değişiklikte UI’yi manuel olarak güncellemek zorunda kalmadan çalışmayı kolaylaştırır.
  3. Veri Tutma Yeteneği: LiveData, verileri tutar ve UI bileşenlerine yalnızca ilgili yaşam döngüsü durumunda iletilir.
  4. Hata Yönetimi: LiveData, hata durumlarını da yönetebilir. Örneğin, bir ağ isteği başarısız olduğunda bu hatayı dinleyen bileşenlere iletir.
  5. Daha İyi Bellek Yönetimi: LiveData, uygulama belleği yönetimi için optimize edilmiştir. Bu, uygulamanın daha düşük bellek tüketimine sahip olmasını sağlar.
  6. Veri Akışı (Flow) ile Entegrasyon: LiveData, Kotlin’in Flow API’si ile entegre olabilir, böylece verileri akış halinde dinlemek ve işlemek mümkündür.

Örnek bir Kotlin LiveData kullanımı şu şekildedir:

Yukarıdaki örnekte, MutableLiveData ile bir liveData oluşturduk. Bir Observer oluşturduk ve bu observer, LiveData'daki her değişikliği dinler. LiveData'nın değeri değiştiğinde, observer otomatik olarak çağrılır.

Son olarak, removeObserver yöntemiyle observer'ı kaldırdık. Bu, LiveData'nın belirli bir yaşam döngüsü sahibi tarafından dinlenmesini durdurur.

Sonuç olarak;

Asenkron, reaktif programlama ve yaşam döngüsü açısından benzer özellikler gösterirler. Flow için Kotlin standart kütüphanesi, multiple values ve cold flow özellikleri öne çıkarç Shared flow için ise Kotlin coroutines kütüphanesi,multiple jobs ve hot flow özellikleri ile flow”dan ayrılır. State flow’da da Kotlin coroutines kütüphanesi de shared flow gibidir. Burdaki farklılık ise state, mutable ve immutable özellikleridir. Livedata ise Android Architecture Components, ui güncellemeleri, hata yönetimi ve daha iyi bellek yönetimi açısından avantajlar sağlar.

Kaynaklar:

--

--