Android Fundamentals-3 | Lifecycle-Aware Components

Suveybesena
5 min readMay 1, 2022

--

Merhabalar,

Bu seride doküman okuma alışkanlığımı geliştirmek ve Android temellerine dair daha kapsamlı bilgi edinmek adına developer.android.com üzerinden seçtiğim konular hakkında notlarımı paylaşıyor olacağım. Keyifli okumalar.

Lifecycle-Aware Components

Lifecycle aware bileşenler, activity ve fragmentlar gibi başka bir bileşenin yaşam döngüsü durumundaki bir değişikliğe yanıt olarak eylemler gerçekleştirir. Bu bileşenler daha iyi organize edilmişlerdir ve daha ” lighter-weight” kod üretmemize yardımcı olur.

Bağımlı bileşenlerin eylemlerini activity ve fragmentların lifecycle metotlarında uygulamak yaygın bir durumdur. Bununla birlikte, bu kalıp, kodun zayıf bir şekilde düzenlenmesine ve hataların çoğalmasına yol açar. Lifecycle aware componentleri kullanarak, bağımlı bileşenlerin kodunu lifecycle metotlarından bileşenlerin kendilerine taşıyabiliriz.

androidx.lifecycle paketi, bir aktivite veya fragmentın mevcut yaşam döngüsü durumuna göre davranışlarını otomatik olarak ayarlayabilen bileşenler olan lifecycle aware bileşenler oluşturmamıza olanak tanıyan sınıflar ve interface’ler sağlar.

Not: androidx.lifecycle’ı Android projenize aktarmak için buradan faydalanabilirsiniz.

Android Framework’da tanımlanan uygulama bileşenlerinin çoğunun kendilerine bağlı yaşam döngüleri vardır. Yaşam döngüleri, işletim sistemi veya framework kodu tarafından yönetilir. Android bu şekilde çalışır ve uygulamamızın bunlara duyarlı olması gerekir. Bunu yapmamak, bellek sızıntılarını ve hatta uygulama çökmelerini tetikleyebilir.

Bileşenlerimizin lifecycle durumlarını lifecycle callbacklerinde yazmak yanlış değildir ancak bu callbacklerde UI ve diğer bileşenleri yöneten çok fazla çağrının olmasına neden olur. Birden çok bileşeni yönetmek, onStart() ve onStop() gibi yaşam döngüsü yöntemlerine önemli miktarda kod yerleştirir ve bu da bunların bakımını zorlaştırır. androidx.lifecycle paketi, bu sorunları esnek ve yalıtılmış bir şekilde çözmemize yardımcı olan class ve interface’ler sağlar.

Lifecycle

Kısaca lifecycle, bir bileşenin (bir activity veya bir fragment gibi) lifecycle state’i hakkındaki bilgileri tutan ve diğer nesnelerin bu durumu gözlemlemesine izin veren bir sınıftır.

Yaşam döngüsü, ilişkili bileşeninin yaşam döngüsü durumunu izlemek için iki ana kavram kullanır:

Framework’den ve Lifecycle sınıfından gönderilen yaşam döngüsü olayları. Bu olaylar, activity ve fragmentlardaki callback olaylarıyla eşlenir.

Lifecycle nesnesi tarafından izlenen bileşenin mevcut durumunu belirtir.

Bir sınıf, DefaultLifecycleObserver’ı uygulayarak ve onCreate, onStart vb. gibi karşılık gelen yöntemleri override ederek bileşenin yaşam döngüsü durumunu izleyebilir. Ardından, Lifecycle sınıfının addObserver() yöntemini çağırarak ve gösterildiği gibi gözlemcimizin bir örneğini ileterek bir observer ekleyebiliriz;

Yukarıdaki örnekte, myLifecycleOwner nesnesi, aşağıdaki bölümde açıklanan LifecycleOwner interface’ini uygular.

LifecycleOwner, sınıfın bir Lifecycle’a sahip olduğunu belirten bir interface’dir. Sınıf tarafından implement edilmesi gereken getLifecycle() adında bir methodu vardır.

Bu interface, Fragment ve AppCompatActivity gibi bireysel sınıflardan bir Lifecycle’ın sahipliğini soyutlar ve bunlarla çalışan bileşenlerin yazılmasına izin verir. Herhangi bir custom application sınıfı, LifecycleOwner interface’ini uygulayabilir.

DefaultLifecycleObserver’ı uygulayan bileşenler, LifecycleOwner’ı uygulayan bileşenlerle sorunsuz bir şekilde çalışır çünkü bir owner, bir observer’ın gözlemlemesi için bir yaşam döngüsü sağlayabilir.

Yukarıdaki örnek için, MyLocationListener sınıfının DefaultLifecycleObserver uygulamasını ve ardından onCreate() yönteminde aktivitenin lifecycle’ı ile başlatmasını sağlayabiliriz. Bu, MyLocationListener sınıfının kendi kendine yeterli olmasını sağlar, yani yaşam döngüsü durumundaki değişikliklere tepki verme mantığı, aktivite yerine MyLocationListener’da bildirilir. Bireysel bileşenlerin logiclerine sahip olabilmesi aktivite ve fragment mantığının yönetilmesini kolaylaştırır.

Yaygın bir use case olarak , lifecycle doğru bir statede değilse belirli callbackleri başlatmaktan kaçınılmalıdır. Örneğin callback , aktivite state’i kaydedildikten sonra bir fragment işlemi çalıştırırsa, bir çökmeyi tetikler, bu nedenle bu callbacki çağırmak istemeyiz.

Bu use case’i kolaylaştırmak için Lifecycle sınıfı, diğer nesnelerin mevcut durumu sorgulamasına izin verir.

Bu şekilde uygular isek LocationListener sınıfımız yaşam döngüsüne duyarlıdır. LocationListener’ımızı başka bir aktiviteden veya fragment’ten kullanmamız gerekirse, onu başlatmamız yeterlidir. Tüm kurulum ve sonlandırma işlemleri sınıfın kendisi tarafından yönetilir.

Eğer bir kütüphane Android yaşam döngüsüyle çalışması gereken sınıflar sağlıyorsa, lifecycle aware componentler kullanılması önerilir. Kütüphane clientları, client tarafında manuel yaşam döngüsü yönetimi olmadan bu bileşenleri kolayca entegre edebilir.

Custom LifecycleOwner

Support Library 26.1.0 ve sonraki sürümlerindeki Fragment ve Activity’ler, LifecycleOwner interface’ini default olarak uygular.

LifecycleOwner yapmak istediğimiz özel bir sınıfımız varsa, LifecycleRegistry sınıfını kullanabiliriz, ancak aşağıdaki kod örneğinde gösterildiği gibi olayları o sınıfa iletmemiz gerekir:

Lifecycle aware componentler için best practiseler

· Activity ve fragmentları mümkün olduğunca yalın tutmamız gerekir. Kendi verilerini yaratmaya çalışmamalılar; bunun yerine, bir ViewModel kullanabilir ve değişiklikleri görünümlere geri yansıtmak için bir LiveData nesnesini gözlemleyebiliriz.

· UI controller’ın sorumluluğunun, veri değiştikçe görünümleri güncellemek veya kullanıcı eylemlerini ViewModel’e geri bildirmek olduğu UI’ler yazmaya çalışmalıyız.

· Data logic’i ViewModel sınıfında yazmalıyız. ViewModel, UI controller ve uygulamamızın geri kalanı arasında bağlayıcı görevi görmelidir. Ancak verileri almak (örneğin bir ağdan) ViewModel’in sorumluluğunda değildir. Bunun yerine, ViewModel verileri almak için uygun bileşeni çağırmalı ve ardından sonucu UI controller’a vermelidir.

· View’larımız ve UI controller arasında temiz bir arabirim sağlamak için Data Binding’i kullanmalıyız. Bu aktivite ve fragmantlarımıza yazmamız gereken güncelleme kodunu en aza indirmemize olanak tanır.

· UI karmaşıksa, UI değişikliklerini işlemek için bir presenter(sunucu) sınıfı oluşturmayı düşünebiliriz. Bu kodu uzatabilir ancak UI bileşenlerimizin test edilmesini kolaylaştırabilir.

· ViewModel’ımızda bir View veya Activity Context’tine başvurmaktan kaçınmalıyız. ViewModel aktiviteden daha uzun sürerse (yapılandırma değişiklikleri durumunda), aktivitemiz sızar ve garbage collecter tarafından uygun şekilde atılmaz.

· Long running işlemleri ve asenkron olarak çalışabilen diğer işlemleri yönetmek için Kotlin coroutines kullanmalıyız.

Lifecycle aware componentler için Use Case’ler

Lifecycle aware componentler, çeşitli durumlarda yaşam döngülerini yönetmemizi çok daha kolay hale getirebilir;

· Genel ve ayrıntılı konum güncellemeleri arasında geçiş yapma. Konum uygulamamız görünür durumdayken genel konum güncellemelerini etkinleştirmek için lifecycle aware componentler kullanmalı ve uygulama arka plandayken ayrıntılı güncellemelere geçmeliyiz. Lifecycle aware bir component olan LiveData, kullanıcımız konum değiştirdiğinde uygulamamızın UI’ının otomatik olarak güncellemesine olanak tanır.

· Video arabelleğe almayı durdurma ve başlatma. Video arabelleğe almayı kısa sürede başlatmak için lifecycle aware componentler kullanabiliriz, ancak uygulama tamamen başlatılana kadar oynatmayı başlatmaması gerekir. Uygulama yok edildiğinde arabelleğe almayı sonlandırmak için de lifecycle aware componentler kullanabiliriz.

· Ağ bağlantısını başlatma ve durdurma. Bir uygulama ön plandayken ağ verilerinin canlı olarak güncellenmesini (akışını) etkinleştirmek ve ayrıca uygulama arka plana geçtiğinde otomatik olarak duraklatmak için lifecycle aware componentler kullanmalıyız.

· Animasyonlu çizimleri duraklatma ve sürdürme. Uygulama arka plandayken animasyonlu çizimleri duraklatmak ve uygulama ön planda olduktan sonra çizimleri sürdürmek için lifecycle aware componentler kullanmalıyız.

Serini devamı için,

Okuduğunuz için teşekkür ederim, bir sonraki yazıda görüşmek üzere :)

Referanslar ;

https://developer.android.com/topic/libraries/architecture/lifecycle

--

--