Giriş
Şu satırı dahil ederiz.
2. EventBus nesnesinin register() metodunu kullanarak Listener tak. Listener'ların @Susbcribe ile işaretli metodları EventBus tarafından tanınır.
3. EventBus.post() ile event gönder
constructor
Şöyle yaparız.
post metodu hemen döner ve event kuyruğa atılır. Bir event için tüm dinleyiciler çağrıldıktan sonra kuyruktaki yeni event işletilir.
Örnek
Şöyle yaparız.
post metodu içinde başka event fırlatmak istersek şöyle yaparız. Elimizde şöyle bir kod olsun.
Açıklaması şöyle. EventBus'a register olan dinleyici sınıfların metodlarının Java'daki kalıtım hiyerarşisine göre de çağırılabileceği anlatılıyor. Örneğin dinleyici sınıf parametresi Object olan bir metod tanımlarsa EventBus ile gönderilen tüm mesajları dinleyebilir.
Örnek
Şöyle yaparız.
Elimizde şöyle bir kod olsun.
Elimizde şöyle bir kod olsun.
unregister metodu
Bu sınıf WeakReference kullanmıyor dolayısıyla dinleyici sınıfın kod kullanılarak bus'tan çıkarılması gerekiyor.
Şu satırı dahil ederiz.
import com.google.common.eventbus.EventBus;
Açıklaması şöyle. Aynı JVM içinde haberleşmek içindir. Eğer asenkron olarak çalışmak istersek AsyncEventBus kullanılabilirAçıklaması şöyle.It is not a general-purpose publish-subscribe system, nor is it intended for interprocess communication
Why can't I do <magic thing> with EventBus?
EventBus is designed to deal with a large class of use cases really, really well. We prefer hitting the nail on the head for most use cases to doing decently on all use cases.Additionally, making EventBus extensible -- and making it useful and productive to extend, while still allowing ourselves to make additions to the core EventBus API that don't conflict with any of your extensions -- is an extremely difficult problem.If you really, really need magic thing X, that EventBus can't currently provide, you should file an issue, and then design your own alternative.
EventBus ve Unit Test
EventBus exception'ları yuttuğu için Assertions.assertFalse() gibi bir çağrı eventbus içinde yapılsa daha test başarısız olarak işaretlenmez. Buna dikkat etmek lazım.
Kullanım
1. Bir adet EventBus nesnesi yarat2. EventBus nesnesinin register() metodunu kullanarak Listener tak. Listener'ların @Susbcribe ile işaretli metodları EventBus tarafından tanınır.
3. EventBus.post() ile event gönder
constructor
Şöyle yaparız.
EventBus bus = new EventBus();
post metodupost metodu hemen döner ve event kuyruğa atılır. Bir event için tüm dinleyiciler çağrıldıktan sonra kuyruktaki yeni event işletilir.
Örnek
Şöyle yaparız.
bus.post ( new String("event!"));
Dinleyen metodu şöyle yaparız.@Subscribe
public void consume(String event) {
System.out.println("Got event: " + event);
}
Örnekpost metodu içinde başka event fırlatmak istersek şöyle yaparız. Elimizde şöyle bir kod olsun.
interface InternalEventCallback {
void run();
}
class InternalEventCallbackHandler {
@Subscribe
public void internalEventHandler(InternalEventCallback r){
r.run();
}
}
Bu handler'ı register ederiz. Şöyle yaparız.eventBus.register(new InternalEventCallbackHandler());
İlk handler içinde önce NestedEvent gönderilir. Bunun sonucuna bakmadan InternalEventCallback da gönderilir. InternalEventCallback çalışınca NestedEvent işlenmiş olur. Onun sonucuna bakarak InternalEventCallback devam eder veya durur.@Subscribe
public void parentEventHandler(ParentEvent parentEvent) {
NestedEvent nestedEvent = createNestedEvent();
eventBus.post(nestedEvent);
eventBus.post(new InternalEventCallback() {
@Override
public void run() {
if(nestedEvent.isCancelled()) {
return;
}
Object anotherNestedEvent = createOtherNestedEvent();
eventBus.post(anotherNestedEvent);
}
});
}
register metoduAçıklaması şöyle. EventBus'a register olan dinleyici sınıfların metodlarının Java'daki kalıtım hiyerarşisine göre de çağırılabileceği anlatılıyor. Örneğin dinleyici sınıf parametresi Object olan bir metod tanımlarsa EventBus ile gönderilen tüm mesajları dinleyebilir.
Otto isimli Guava tabanlı bir EventBus, Guava'daki bu çalışma şeklini değiştirmiş. Yeni bir dinleyici EventBus'a kayıt olunca sınıf hiyerarşisini dolaşmayarak sadece verilen metodu kaydetme yöntemini seçmiş.To listen for a common event supertype (such as EventObject or Object)...
...in traditional Java events: not easy.
...with EventBus: events are automatically dispatched to listeners of any supertype, allowing listeners for interface types or "wildcard listeners" for Object.
Şöyle yaparız.
bus.register(foo);
ÖrnekElimizde şöyle bir kod olsun.
public class ComponentRepainter {
@Subscribe
public void doSomething(EventObject e) {
((Component) e.getSource()).repaint();
}
}
Elimizde şöyle bir kod olsun.EventBus eventBus = ... ;
eventBus.register(new ComponentRepainter());
Her türlü event nesnesini ComponentRepainter nesnesinin de duyması için şöyle yaparızMouseEvent e = ... ;
eventBus.post(e);
ÖrnekElimizde şöyle bir kod olsun.
class MyEvent[T] protected () { /* Your methods here */ }
class MyEventInt extends MyEvent[Int] {}
class MyEventString extends MyEvent[String] {}
Her bir event tipi için @Subscribe metodu yazarsak generic event'ler de gönderebiliriz.unregister metodu
Bu sınıf WeakReference kullanmıyor dolayısıyla dinleyici sınıfın kod kullanılarak bus'tan çıkarılması gerekiyor.
Hiç yorum yok:
Yorum Gönder