Android EventBus Kütüphanesi Kullanımı

Merhaba arkadaşlar,
Mobilhanem.com sitemiz üzerinden anlattığımız/yayınladığımız Android  derslerimize Android EventBus Kütüphanesi Kullanımı ile devam ediyoruz. Bir çok android geliştiricinin kullanması gereken kütüphanelerden biride EventBus dır. EventBus kütüphanesi ile uygulama içindeki event ları kolaylıkla yakalayabilir , Fragment, Activity, Thread, Service vb sınıflar arasında da veri transferini gerçekleştirebiliriz. Bu kütüphane olmadan zaten klasik yöntem ile yani Interface kullanarak da event ları yakalayabiliriz. Fakat bu kütüphane ile kod yapısı daha okunabilir ve düzgün bir hale gelmiştir.

( ayrıntılı incelemek için github adresi : EventBus )

EventBus kütüphanesinin işleyişini bu resimde görebiliriz. Bir event yayımlanır EventBus sayesinde de yayımlanan event ilgili abone ler tarafından yakalanır. Uygulamanızda birden fazla event olabilir yada tek bir event fırlatılır ve bütün projede o event yakalanıp kullanılır. ( örnek olarak telefonun şarj yüzdesini gösteren bir event düşünün olay tekdir ve uygulamanın her yerinde şarj yüzdesinin ne kadar olduğunun gösterilmesi EventBus tarafından kolaylıkla transfer edilir. )

EventBus kütüphanesinin nasıl kullanıldığını anlayabilmek için temel bir örnek yapalım. Bu örnekte sizlere Activity den Activity e nasıl object gönderilir , Activity den Fragment lara nasıl veri gönderilir gibi önemli unsurlardan bahsedeceğim. Öncelikle android projemize EventBus kütüphanesini import ediyoruz. build.gradle klasörüne aşağıdaki kodu ekliyoruz ve daha sonra projemizi sync ediyoruz.

GreenRobot un çıkarmış olduğu GreenRobot EventBus kütüphanesi size Square şirketinin EventBus kütüphanesinin çağırıştırabilir ikiside aynı işlev için kullanılıyor fakat Square şirketinin çıkarmış olduğu bu kütüphane artık deprecated olduğu için GreenRobot EventBus kütüphanesi tercih ediliyor.

Kısaca kullanım şeklinden de bahsedecek olursam; Fragment da yada Activity de olayın meydana geldiğini tek satır kod ile belirtiyoruz.

Bu olayı başka bir sınıfta yakalamak istiyorsak da o olayı yakalamak istediğimizi ilgili sınıfa haber veriyoruz bu işlemede register işlemi deniyor.

İlgili olayı artık dinlemek istemiyorsak veya onunla ilgili işlemimiz bittiyse artık haberdar olmak istemediğimizi söylüyoruz bu işlemede unregister işlemi deniyor.

Gerçekleştirmek istediğimiz olayı artık yakalayıp kullanmak istiyorsak da Fragment yada Activity sınıfımızda subscribe ederek fonksiyonu yazıyoruz.

Evet arkadaşlar temel kuralları söyledikten sonra şimdi uygulamalı olarak nasıl yapıldığını anlatalım; öncelikle EventBus sınıfımızı singleton olarak yani tek bir sınıf üzerinden kontrol etmemiz uygulamamızı rahatlatacağı için aşağıdaki yapıyı oluşturuyoruz.

GlobalBus.java

Şimdi gelelim MainActivity sınıfımızı oluşturmaya ; bu uygulamada kullanıcı bir input girecek ve string gönder dediği anda ilgili Fragment lar tetiklenecek EventBus yardımı ile de gelen değer alınıp Fragment larda gösterilecektir. object gönder butonuna bastığımız da ise kod tarafında oluşturduğumuz User objesi diğer Activity e gönderilecek ve gerekli işlemler yapılacaktır. MainActivity sınıfımız aşağıdaki gibidir.

MainActivity.class

Yukarıdaki kod yapısında gördüğünüz gibi uygulamamızda iki farklı olayın tetiklenmesini istedik birisi Fragment lara veri göndermek için diğeri ise Activity ler arası iletişim için işte bu yüzden iki farklı event tanımlıyoruz. Eğer farklı event lar tanımlamazsak EventBus da tek bir sınıf üzerinden gittiğimiz için de bir eventı tetiklediğimiz de diğer event de eğer bunu dinliyorsa orası da etkilenecektir. Bu konuda dikkat etmemiz gerekiyor. Nerede ne kullancağımızı belirleyip ona göre event lar oluşturmalıyız.

ActivityToActivityEvent.java

ActivityToFragment.java

FirstFragment.java sınıfımız aşağıdaki gibidir. onResume ve onPause methodlarında gerekli register ve unregister kodlamalarını yaptık. Yukarıda oluşturduğumuz event geldiğinde de içinden değeri alıp ekranda gösterdik. ( not: Eğer Fragment ımızı register etmeden kodu çalıştırırsak gelen değeri hiç bir şekilde alamayacağız. Ayrıca haberdar olma işlemi bittiğinde gereksiz yere kodun ilgili event dan haberdar olmasını kesmek içinde unregister demeyi kesinlikle unutmuyoruz. Aksi halde gereksiz yere haberdar olmaya devam edecek ve kodlamada memory leak olaylarına girecektir. Bu örnekte sadece iki tane event oluşturup haberdar etmeye çalıştık fakat uygulamamızın boyutun daha büyük ve kapsamlı olduğunu düşünürsek anlattığım şekilde kodlama yapmaya özen göstermeliyiz. )

FirstFragment.java

MainActivity sınıfımızdan postSticky kullanarak ThirdActivity sınıfımıza User objesi gönderdik ( User modelinin içinde isim, soyad, bölüm ve yaş gibi değişkenleri tuttuk ) ilgili Activity event dan haberdar olduğunda gelen User objesinin içindeki değerleri ekranda gösterdik.

ThirdActivity.java

User modelimizde aşağıdaki gibidir.

User.java

Evet arkadaşlar aslında yaptığımız işlemler bu kadar EventBus kütüphanesinin kullanarak hem kod karmaşıklığını azaltmış hem de daha performanslı kodlar oluşturmuş oluyoruz. Activity , Fragment , Service , Thread vb. android bileşenleri arasında etkili bir iletişim kurmak istiyorsak EventBus kullanımı işte bu kadar kolay. Dersimizdeki kaynak kodu indirip çalıştırdığınızda yapılan işlemlerin ekran görüntüleride aşağıdaki gibidir.

İlgili iki Fragment sınıfımıza “mobilhanem” çıktısını gönderdik ve gördüğünüz gibi ekranda gösterdik.

       

Object Gönder dediğimizde ise aşağıdaki ekran görüntüsünü alacaksınız android cihazınızda.

 

EventBus olmadan Intent ler arası veri gönderimi nasıl oluyordu derseniz de bu dersimizi inceleyebilirsiniz.

Mobilhanem.com üzerinden anlattığımız mobil uygulama geliştirme derslerine devam edeceğiz. Konu hakkında sorunuzu yorum alanından sorabilirsiniz. Konu dışı sorularınızı ve tüm yazılımsal sorularınızı sorucevap.mobilhanem.com sitemizden de sorabilirsiniz.

Bir dahaki dersimizde görüşmek dileğiyle..

Tüm Android Ders, Proje ve Kaynak Kodlar için tıklayınız.

 

 

 

Alper Beyler

Yüksek Lisans: Çankaya Üniversitesi / Bilgisayar Mühendisliği
Lisans: Çankaya Üniversitesi / Bilgisayar Mühendisliği (4/3.30) (2010-2014)
Lisans : Viyana Teknik Üniversitesi / Bilgisayar Bilimleri (2013)

10 Yorum

  • Merhabalar. Verilerimi gerek ilkel veriler gerek sınıf objeleri/listeleri olmak üzere Sharepreference ile taşıyorum. Bu konuda düşünceleriniz alabilrimiyim. Sqlite-Shareprefernce kullanımının proje boyutuna etkisi hakkında nedir deneyimleriniz. Share yapısına alışıgım fakat uygulama boyutunu çok etkiliyor bu etki Sqlite yapısı ile aynı etkide midir.? Bunları söylerken konumun eventbusla ilişkisi; bu noktada bu üçlü veri depolama/aktarma sistemleri arasında + ve – leri aramaktayım.

    • SHAREDPREFERENCES data keydetmek içindir, data taşımak için değil. Yanlış bir yöntem Sqlite ile de veri taşınmaz bunlar verileri depolamak içindir.
      Yönteminizi değiştirmelisiniz.

      • Kaydedip gerekli yerde çekip kullanmaya taşımak olarak ifade ettim. Depolama aracı olarak kullanıyorum. Sormak istediğim uygulamanın boyutuna etkisi noktasında kıyaslanması idi.

          • Elbette yöntemlerin artıları eksileri var. Sqlite işlemlerin upraştırıcı olduğu için gerekmedikce uzak duruyorum. Soruna gelince ilgili veriyi share ile ilgili “anahlatkelime ” ile malum putString() saklıyor diğer sayfada aynı anahtar kelime ile getString() ile elde ediyorum. Ve döngü kurulduğu zaman temizleme işlemleri

          • Samir Samedov, Peki başka bir uygulama ile başka bir uyglamanın preferencesine string nasıl eklenir?

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?