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:
- direkt ya da sıkı sıkıya bağlı kod bileşenleri
- bağlı olunacak yapılara/yapılardan teker teker kayıt olmak/kaydı silmek
- kod tekrarı
- testin zorlaşması
- 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.
@Override public void onStart() { super.onStart(); EventBus.getDefault().register(this); }
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.
@Override public void onStop() { super.onStop(); EventBus.getDefault().unregister(this); }
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.
@Subscribe public void onEvent(MessageEvent event) { Toast.makeText(this, "Hey, my message" + event.getMessage(), Toast.LENGTH_SHORT).show();. }
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.
public class MessageEvent { public String mMessage; public MessageEvent(String message) { mMessage = message; } public String getMessage() { return mMessage; } }
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.
EventBus.getDefault().postSticky(new MessageEvent("Hey event subscriber!")); EventBus.getDefault().post(new MessageEvent("Hey event subscriber!"));
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.
EventBus.getDefault().postSticky(new LocationReceivedEvent(6.4531, 3.3958))
Yapışkan Event'lere Abone Olmak
// UI updates must run on MainThread @Subscribe(sticky = true, threadMode = ThreadMode.MAIN) public void onEvent(MessageEvent event) { textField.setText(event.getMessage()); }
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
LocationReceivedEvent locationReceivedStickyEvent = EventBus.getDefault().getStickyEvent(LocationReceived.class); if(stickyEvent != null) { EventBus.getDefault().removeStickyEvent(locationReceivedStickyEvent); }
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
@Subscribe(threadMode = ThreadMode.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
@Subscribe(threadMode = ThreadMode.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
@Subscribe(threadMode = ThreadMode.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
@Subscribe(threadMode = ThreadMode.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.
@Subscribe(priority = 1); public void onEvent(MessageEvent event) { textField.setText(event.getMessage()); }
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.
@Subscribe public void onEvent(MessageEvent event){ EventBus.getDefault().cancelEventDelivery(event); }
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.
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Update me weeklyEnvato Tuts+ tutorials are translated into other languages by our community members—you can be involved too!
Translate this post