event bus for android

24
EventBus for Android Ting Cheng

Upload: ting-cheng

Post on 17-Jul-2015

217 views

Category:

Engineering


4 download

TRANSCRIPT

Page 1: Event bus for android

EventBus for AndroidTing Cheng

Page 2: Event bus for android
Page 3: Event bus for android

Intent, Handler,

Broadcast

Page 4: Event bus for android

Status Quo in Android

Fragment Fragment

Activity

Service / Helper

Thread

Activity

Page 5: Event bus for android

Issues !

• Define interfaces

• Callbacks for async

• Listener management

• Propagation through all layers

Page 6: Event bus for android

EventBus

Fragment Fragment

Activity

Service / Helper

Thread

Activity

Event

Bus

Page 7: Event bus for android

Three things

• Event

• Subscriber

• Publisher

Page 8: Event bus for android

EventBus in 4 Steps

1. Define an event

public class MyEvent {}

2. Register subscriber

EventBus.getDefault().register(this);

3. Post an event

EventBus.getDefault().post(event);

4. Receive the event

public void onEvent(MyEvent event);

Page 9: Event bus for android

Publish / Subscribe

PublisherEvent

Bus

Subscriber

Event

post()

EventonEvent()

Subscriber

Event

onEvent()

Page 10: Event bus for android

• EventBus instances

• It anywhere in your code

• Event handler methods

• Naming convention: onEvent

• public visibility

• No return value (void)

• Single parameter for the event to receive

Page 11: Event bus for android

Event Type is a Filter

PublisherEvent

Bus

Subscriber

Event

post

(MyEvent)

EventonEvent(MyEvent)

Subscriber

onEvent(OtherEvent)

Page 12: Event bus for android

Code: Sender

MyEvent myEvent = new MyEvent(anyData);

EventBus.getDefault().post(myEvent);

Page 13: Event bus for android

Code: ReceiveMyActivity extends Activity

// onCreate or onResume

EventBus.getDefault().register(this);

// onDestroy or onPause

EventBus.getDefault().unregister(this);

public onEvent(MyEvent event) { … }

Page 14: Event bus for android

Example:

Fragment to Fragment

ListFragment DetailFragment

Activity

Page 15: Event bus for android

DetailFragment

// Here‘s the action. How is it called?

public void loadDetails(Item item) {

}

Page 16: Event bus for android

ListFragment

interface Contract {

void onItemSelected(Item item);

}

// Propagate to Activity

((Contract)getActivity()).onItemSelected(item);

Page 17: Event bus for android

Activity

public class MyActivity implements ListFragment.Contract {

public void onItemSelected(Item item) {

DetailFragment detailFragment = (DetailFragment)

getFragmentManager().findFragmentBy…;

detailFragment.loadDetails(item);

}

}

Page 18: Event bus for android

EventBus Example

Page 19: Event bus for android

Event class

public class ItemSelectedEvent {

public final Item item;

public ItemSelectedEvent(Item item) {

this.item = item;

}

}

Page 20: Event bus for android

Post / Receive

// In ListFragment

EventBus.getDefault().post(new ItemSelectedEvent(item));

// In DetailFragment (extends EventBusFragment)

public void onEvent(ItemSelectedEvent event) {

}

Page 21: Event bus for android

Thread Modes

• PostThread: Direct call in same thread

• MainThread: UI updates etc.

• BackgroundThread: „not the main thread“

• Async: always asynchronous to posting

• Used in the method name: onEventXXX

• No additional code required

Page 22: Event bus for android

Tips

Page 23: Event bus for android

Sticky Event• Events can be posted using sticky mode

postSticky(event); // Instead of post(…)

• The last sticky event is kept in memory

• Registration with getting sticky events

registerSticky(subscriber);

• Query for sticky event

getStickyEvent(Class<?> eventType)

• Remove sticky event (Class or Object)

removeStickyEvent(Class<?> eventType)

Page 24: Event bus for android

When to use EventBus• Medium/high distance of components:

• Potentially multiple dependencies

• Asynchronous logic

• When not to use EventBus

• Strictly internal matters:

• Use methods and interfaces instead

• Inter-process communication