Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Code
  2. Android
Code

Android'de EventBus Kullanımı

by
Length:ShortLanguages:

Turkish (Türkçe) translation by Ugurcan Yildirim (you can also view the original English article)

Tipik bir Android uygulaması birçok katmandan, modülden, ve Fragment, Activity, Presenter, Service gibi yapılardan oluşur. Bu bileşenler arasında etkili bir iletişim sağlamak özellikle birbirlerine sıkı sıkıya bağlı olduklarında zor olabilir.

Uygulama mimarinizin daha alt katmanlarında, örneğin veri tabanı katmanında, bir aksiyon gerçekleştiğinde, buradaki veriyi daha üst katmanlara, örneğin arayüz katmanına, göndermek isteyebilirsiniz. Bunu yapabilmek için, listener interface'ler, AsyncTask'lar ya da callback'ler kullanabilirsiniz. Bunların hepsi iş görecektir. Fakat aşağıdaki sorunlarla karşılaşmanız muhtemel olacaktır:

  1. direkt ya da sıkı sıkıya bağlı kod bileşenleri
  2. bağlı olunacak yapılara/yapılardan teker teker kayıt olmak/kaydı silmek
  3. kod tekrarı
  4. testin zorlaşması
  5. hata çıkma ihtimalinin artması

"Yayınla/abone ol" veya mesaj kanalı mimarisini kullanmak bu gibi tüm potansiyel problemleri engelleyecektir. Birbirlerinden haberlerinin olmasına ihtiyaç duymadan, bu yolla uygulamanızdaki bileşenler arasında etkili bir iletişim kurabilirsiniz. Android'de "yayınla/abone ol" metodunu kullanarak, herhangi bir uygulama bileşeni "event" yayınlayıp kanala gönderebilir, ve ilgili abone bileşen bu "event"i alıp kullanabilir.

greenrobot EventBus kütüphanesini kullanabilmek için öncelikle app modülündeki build.gradle dosyasına compile 'org.greenrobot:eventbus:3.0.0' satırını eklemeli ve projenizi senkronize etmelisiniz.

Bir Event'e Abone Olmak

Bir event'e abone olacak sınıf basitçe event kanalına kaydolur. İsterse bu kanaldan kaydını da silebilir. Abone olabilmek için aşağıdaki 3 şeyi yapmalısınız:

1. Abone olacak sınıfı register() metoduyla kanala kaydedin. Bu event kanalını, event almayı beklediğiniz yönünde bilgilendirir. Activity'de bu işlem onStart() metodunda yapılır. Fragment'da ise bunu onAttach(Activity) methodunda yapın.

2. Abone olmuş sınıfın kanaldan kaydını silin. Bu, kanala "artık gelen event'leri istemiyorum" demektir. Activity'de bu işlem onStop() metodunda yapılır. Fragment'da ise bunu onDetach() methodunda yapın.

3. onEvent() metodunu kodlayın. Bu metod, sizin hangi türde bir event beklediğinizi belirten ve event geldiğinde yapılacak şeyleri kodladığınız yerdir. Metodun üstüne @Subscribe anotasyonunu eklemeyi unutmayın. Bu örnekte normal bir event'e abone oluyoruz, yapışkan bir event'e değil. Farkı daha sonra açıklayacağım.

Event Mesajlarını Tanımlamak

greenrobot EventBus'ta event'ler her zaman tanımladığınız standart Java objeleridir. İsterseniz ayrı event sınıfları da yaratabilirsiniz. Bu sınıfların herhangi bir sınıfın alt sınıfı olması ya da bir interface'i gerçeklemesi gerekmez.

Event ve Yapışkan Event Arasındaki Fark

Kanala normal event ve yapışkan event göndermenin arasındaki fark, EventBus tarafından kullanılan önbellek mekanizmasıyla alakalı bir durum. Kanala yapışkan bir event gönderdiğinizde, bu event önbellekte saklanır. Yeni bir Activity veya Fragment o event kanalına abone olduğunda, yeni bir event'in yayınlanmasını beklemeden en son yayınlanan ve önbellekte saklanan yapışkan event'i direkt olarak alır. Bu event herhangi bir abone onu kanaldan alsa bile önbellekte saklanmaya devam eder.

Yapışkan event'ler postSticky(MessageEvent) metoduyla gönderilirken, normal event'ler post(MessageEvent) metoduyla gönderilir.

Normal, yani yapışkan olmayan event'ler için eğer bir abone bulunamazsa gönderilen event boşa gitmiş olur. Fakat yapışkan event'lerde sonradan gelebilecek bir abone için bu event'ler önbellekte saklanır.

Peki normal ya da yapışkan bir event kullanacağınıza nasıl karar vereceksiniz? Eğer kullanıcı lokasyonu takibiyle ilgili bir işle uğraşıyorsanız, ya da veri önbellekleme veya cihaz pil seviyesi takibi gibi bir işte yapışkan event'ler sizin aradığınız şey olabilir.

Yapışkan Event'lere Abone Olmak

Yapışka bir event'e abone olmak için @Subscribe anotasyonunun içine sticky = true yazmanız gerekiyor. Bu, bizim MessageEvent tipindeki yapışkan event'leri önbellekten almak istediğimiz anlamına geliyor.

Yapışkan Event'leri Silmek

Yapışkan bir event'i removeStickyEvent(Event) metoduyla önbellekten silebilirsiniz. Önbellekteki tüm yapışkan event'leri silmek istiyorsanız removeAllStickyEvents() metodunu kullanın.

EventBus Thread Modları

Aboneler için kullanabilecekleri 4 farklı thread modu mevcuttur: POSTING, MAIN, BACKGROUND, ve ASYNC.

POSTING

Bu, EventBus için varsayılan thread modudur. Abone, event'leri gönderildiği thread'le aynı thread'de alır. Opsiyonel olarak @Subscribe anotasyonunun içinde thread modunu ThreadMode.POSTING olarak ayarlayabilirsiniz.

MAIN

Bu thread modunda, abone, event'leri hangi thread'den gönderildiğine bakılmaksızın UI thread'de alır. Bu thread modu, event alındığında arayüz işlemi yapacaksanız kullanmanız gereken bir moddur.

BACKGROUND

Bu thread modunda, abone, event'leri POSTING modunda olduğu gibi gönderildiği thread'le aynı thread'de alır. Buradaki fark, eğer event UI thread'de gönderildiyse, abone onu bir arkaplan thread'inde alır. Bu, event'i aldıktan sonra yapılacakların UI thread'i bloke etmesini önlemek içindir. Yine de, bu arkaplan thread'inde uzun sürecek bir işlem yapmamaya özen gösterin.

ASYNC

Bu thread modunda, abone, event'leri her zaman gönderilen ve UI thread'den bağımsız olarak ayrı bir thread'de alır. Bu, abonenin ayrı bir thread'de çalışmasına olanak sağlar. Network operasyonları gibi uzun süren işlemler için kullanışlı bir moddur.

Abone Öncelikleri

Eğer abonelerin bir event'i hangi sırada alacağıyla ilgili bir değişiklik yapmak istiyorsanız, bunu kayıt sırasında öncelik seviyeleri kullanarak belirtmeniz gerekemektedir. Daha yüksek öncelik seviyesine sahip aboneler, bir event'i diğer abonelere göre daha önce alırlar. Bu sadece aynı thread modundaki aboneleri etkileyen bir durumdur. Varsayılan öncelik 0'dır.

Event'leri İptal Etmek

Eğer bir event'i diğer abonelerine ulaşmadan önce durdurmak isterseniz, cancelEventDelivery(Event) metodunu bir abonenin (event'i ilk alan/yüksek öncelikli) event'i aldığı metodun içinde çağırarak bunu gerçekleştirebilirsiniz.

Sonuç

Bu öğretici yazıda aşağıdakileri öğrendiniz:

  • greenrobot EventBus'ı ve EventBus'ın bir Android uygulamasını nasıl iyileştirebileceği
  • normal ve yapışkan event'ler arasındaki farkları
  • farklı thread modlarını ve hangisinin ne zaman kullanılabileceğini
  • abone önceliklerini
  • bir event'i iptal etmeyi

greenRobot EventBus hakkında daha fazlasını öğrenmek için resmi dökümantasyon sayfasını ziyaret edin.

Bu iletişim metodunu kullanmanıza olanak sağlayan bir diğer kütüphane ise RxAndroid. Envato Tuts+ sitesinde bulunan RxAndroid hakkındaki yazıya, veya diğer Android kurslarına ve öğretici yazılarına göz atın.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.