Skip to content

Instantly share code, notes, and snippets.

@smyykb
Created October 9, 2017 20:41
Show Gist options
  • Save smyykb/41a04a254eff26f53425de3cb936c00e to your computer and use it in GitHub Desktop.
Save smyykb/41a04a254eff26f53425de3cb936c00e to your computer and use it in GitHub Desktop.
EventBus - Greenrobot
1 - Bir event tanımla
public class MyEvent{}
2 - Eventi yakalayabilmek için Abone olman lazım.
EventBus.getDefault().register(this);
3 - Bir event gönder gelsin.
EventBus.getDefault().post(new MyEvent());
4 - Event geldi merhaba de bakalım :)
public void onEvent(MyEvent event);
EventBus'in genel çalışma şeması
post() ---Event-->Subscriber(onEvent())
Publisher ---Event----> EVENTBUS-|
---Event-->Subscriber(onEvent())
gradle
compile 'de.greenrobot:eventbus:2.4.0'
A - DEFINE AN EVENT
public class MessageEvent {
private final String message;
public MessageEvent(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}
B - DEFINE SUBSCRIBERS
EventBus3 öncesi annotation desteklemiyordu. O nedenle
event dinlemek istediğimiz sınıfımızda "onEvent" isimli void geri donen public bir method tanımlamak zorundaydık.
Örnek olarak Fragment'da bir event bekliyoruz. Lifecycle methodları içinde EventBus'a abone olmak istediğimizi söylüyoruz.
Daha sonra mesajı dinlemek için callback methodu yazıyoruz bu onEvent isminde olmalı. Aynı zamanda public ve void
@Override
public void onAttach(Context context) {
super.onAttach(context);
EventBus.getDefault().register(this);
}
@Override
public void onPause() {
EventBus.getDefault().unregister(this);
super.onPause();
}
public void onEvent(MessageEvent event) {
Log.i(TAG, "Your Message : " + event.getMessage());
}
C - POST TIME
EventBus'a abanolere göndermek istediğimiz mesajımızı iletiyoruz.
EventBus.getDefault().post(new MessageEvent("DO WHAT MAKES YOUR SOUL HAPPY"));
* EventBus3.0 ile annotation devri açılıyor ve subscriber tanımlaması daha yalın hale geliyor.
Neler değişti?
- paket tanımı değişti, yani kütüphanenizi güncellemek isterseniz importları düzenlemeniz gerek.
import de.greenrobot.event.EventBus; //old
import org.greenrobot.eventbus.EventBus; //new
- importları düzenlediniz projeyi çalıştınız ama subscriber classlarınız annotation methodları istiyor.
Daha onceki versiyonda onEvent methodu olmalıydı. Yeni versiyonda method ismi onemli değil fakat bir @Subscribe'lı method bekliyor.
@Subscribe
public void messageEventIsCommingHere(MessageEvent event) {
Log.i(TAG, "Your Message : " + event.getMessage());
}
Paket ismi değiştiği için paralelde Eventbus2 ve 3'ü çalıştırabilirsiniz. Eski kodlarınız çalışmaya devam edecektir.
Eventbus3'e taşımak istersenizde importlarınızı düzenlmeniz ve onEvent methodlarıın başına @Subscribe eklemeniz gerekiyor.
*Sticky Event
Bir event gönderdik ve bu event'in hiç subscriber'ı yok. Bu durumda gönderdiğimiz event uzaya karışmış oluyor.
Gönderdiğimiz eventin EventBus'in cashlemesini ve ona subscribe olan her classında haberdar olmasını istersek sticky eventleri kullanıyoruz.
Bir subscriber yakalasa bile önbellekte tutulmaya devam eder.
EventBus.getDefault().postSticky(new MessageEvent("Love Always"));
Yapışkan bir event'a abone olmak için
@Subscribe(sticky = true)
public void onEvent(MessageEvent event) {
textField.setText(event.getMessage());
}
Yapışkan eventleri önbellekten temizlemek için
EventBus.getDefault().removeStickyEvent(event);
*Thread Modları
- ThreadMode: POSTING, default thread modu, aynı thread içersinde çağrılır.
@Subscribe(threadMode = ThreadMode.POSTING)
- ThreadMode: BACKGROUND, backgroud thread'ı içersinde çağrılır
- ThreadMode: MAIN, UI thread de alır.
- ThreadMode: ASYNC, gönderen veya UI threadden farklı bir threadde alınır.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment