SlideShare une entreprise Scribd logo
1  sur  47
EventBus
for Android.
droidcon NL
23.11.2012
Markus Junginger


      © Copyright 2012 Markus Junginger.
                       All rights reserved.
Random Qoutes
Status Quo in Android
 Q: Who is talking to whom?
Status Quo in Android

                                   Activity



             Activity


                                       Service / Helper




  Fragment              Fragment                Thread
Communication Issues?!
 Tight coupling of components
   Inflexible, changes are expensive
 Boiler plate code
  – Define interfaces
  – Callbacks for asynch. communication
  – Listener management
  – Propagation through all layers
EventBus Communication

   Activity                  Activity



               Event
                Bus
                         Service / Helper




  Fragment    Fragment       Thread
EventBus for Android
   Event-based Publish/Subscribe
   Bus: central communication
   Inspired by Guava„s EventBus (Google)
   Android-optimized
   Open Source, Apache 2 License
    https://github.com/greenrobot/EventBus
EventBus in 4 Steps
1. Define an event

2. Register subscriber

3. Post an event

4. Receive the event
EventBus in 4 Steps: Code!
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);
Publish / Subscribe


                                        Subscriber
                              Event
             Event    Event           onEvent()
 Publisher
             post()   Bus
                              Event

                                       Subscriber

                                      onEvent()
EventBus Instances
 EventBus instances
 Instances are indepent from each other
 For many apps, a single instance is fine
 „Convenience“ Instance
  EventBus.getDefault()
 Aquire it anywhere(!) in your code
Event Handler Method:
onEvent
 EventBus scans subscribers
  – During (first) registration of subscriber
  – For event handler methods
 Event handler methods
  – Naming convention: onEvent
  – public visibility
  – No return value (void)
  – Single parameter for the event to receive
Type-based Event Routing
 Event type: Java class of the event
 To receive an event, its type must match
 post(new MyEvent());
   onEvent(MyEvent event) {…}
 Type hierarchy of events
  – Implement logging of all events:
    onEvent(Object event)
Event Type is a Filter


                                           Subscriber
                                 Event
             Event       Event           onEvent(MyEvent)
 Publisher
             post        Bus
             (MyEvent)
                                          Subscriber

                                         onEvent(OtherEvent)
It„s time to see some

CODE
EventBus Code: Sender
MyEvent myEvent = new MyEvent(anyData);
EventBus.getDefault().post(myEvent);
EventBus Code: Receiver
MyActivity extends Activity // no interf.

// onCreate or onResume
EventBus.getDefault().register(this);

// onDestroy or onPause
EventBus.getDefault().unregister(this);

public onEvent(MyEvent event) { … }
Example: Fragment to
Fragment
   Tap on one fragment
   Another fragment reacts
   Typical list/details scenario
   Conventional setup:                Activity

    Activity is managing
    Fragments
                            Fragment              Fragment
Conventional: DetailFragment
// Here‘s the action. How is it called?
public void loadDetails(Item item) {
  …
}
Conventional: ListFragment
interface Contract {
     void onItemSelected(Item item);
}

// Propagate to Activity
((Contract)getActivity()).onItemSelected(item);
Conventional: Activity
public class MyActivity implements
ListFragment.Contract {

    public void onItemSelected(Item item) {
      DetailFragment detailFragment =
       (DetailFragment)
       getFragmentManager().findFragmentBy…;
      detailFragment.loadDetails(item);
    }
}
EventBus: Event class
public class ItemSelectedEvent {
  public final Item item;

    public ItemSelectedEvent(Item item) {
      this.item = item;
    }
}
EventBus: Post & Receive
// In ListFragment
EventBus.getDefault().post(new
     ItemSelectedEvent(item));



// In DetailFragment (extends EventBusFragment)
public void onEvent(ItemSelectedEvent event) {
…
}
Event Delivery in other Threads

THREADING SUPPORT
Why do Threads matter?
 Responsive UI, Android conventions
  – Main/UI thread must not block
  – UI updates in the main thread
  – Networking etc. in background threads
 Threads and Events
  – Thread posting events
  – Thread handling events
  – Posting and handling thread may differ
EventBus Threading Support
 Event delivery using threads
 Event handler method decides
  (handler knows best what it is doing)
 Naming conventions for onEvent methods
 To deliver in the main thread:
  onEventMainThread(…)
 (All methods beginning with onEvent are
  checked for typos)
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
Threading Example
 Network thread posts result
 post(new UserLoginEvent(name));


 Fragment reacts to event in main thread
 public void
 onEventMainThread(UserLoginEvent e) {
   textView.setText(e.getName());
 }
Asynchronous execution and error dialogs

SNEAK PREVIEW
Upcoming: EventBus 2.1
 EventBus 2.1 is not final yet;
  Still gathering experience and feedback
 Everything pushed to master branch
 No relevant changes in the core (planned)
 Comes with some helpers
  – AsyncExecutor
  – Error dialog
EventBus 2.1: AsyncExecutor
 A thread pool, but with failure handling
 RunnableEx interface
  – Like Runnable to define code to run async.
  – May throw any execption
 ThrowableFailureEvent
  – Posted when exception occurs
  – Throwable object is wrapped inside
  – Subclass to customize and filter for type
AsyncExecutor: Calling Code
AsyncExecutor.create().execute(
  new RunnableEx {
    public void run throws LoginException {
      remote.login();
      EventBus.getDefault().postSticky(
        new LoggedInEvent());
      // No need to catch Exception
    }
  }
}
AsyncExecutor: Receiving
Code
public void
onEventMainThread(LoggedInEvent event) {
  // Change some UI
}
Comparison to AsyncTask
 AsyncExecutor advantages
  – Don‟t worry about configuration changes
    (typically device rotation)
  – Failure handling
  – EventBus (other dependencies somewhere?)
 AsyncTask advantage
  – Canceling task
EventBus 2.1: Error Dialog
 Operations may fail (networking, etc.)
 Some UI response should be shown
  – Currently: error dialogs
  – Later: Possibly maybe someth. Crouton-ish
 Multiple errors: don‟t open multiple times
 Goal: Minimize required code
How Error Dialogs work
 Error handling “attaches” to Activities
 Displaying dialogs is triggered by events
 ThrowableFailureEvent or subclass
  – AsyncExecutor sends those
  – Or post those events manually
Error Dialogs: Code
// In onCreate in your Activity
ErrorDialogManager.attachTo(this);

// Trigger the dialog
bus.post(new ThrowableFailureEvent(ex));
// Or let AsyncExecutor do it for you…
Dialog Configuration
 Which texts to display in the dialog?
 Simple option: Configure
  – Supply default resources for title and text
  – Map exception types  texts
 Flexible option: extend
  ErrorDialogFragmentFactory
Dialog Configuration: Code
// Initialize in your Application class
ErrorDialogConfig config = new
  ErrorDialogConfig(getResources(),
    R.string.error_generalTitle,
    R.string.error_general);
config.addMapping(UnknownHostException.class,
  R.string.error_noInternetConnection);
config.addMapping(IOException.class,
  R.string.error_generalServer);
ErrorDialogManager.factory = new
  ErrorDialogFragmentFactory.Support(config);
Comparison Android
Broadcast
 Nice, but somewhat inconvenient
 BroadcastReceiver has to be extended
 Registration needed for every event type
 Extra work to filter for desired event types
  (IntentFilter with e.g. ACTION String)
 Data is converted into Intent extras
Tiny bits and some other stuff

TIPPS AND SNIPPS
Sticky Events
 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)
Events Class
 Event classes are tiny; group them

public class Events {
  public static class InitThreadCompleteEvent {
  }

    public static class LoginCompleteEvent {
    }
}
EventBusFragment/-Activity
 Superclass depends on your setup
 Implement in your project
 class EventBusFragment extends Fragment {
 public void onCreate(…) {
   super.onCreate(…);
   EventBus.getDefault().register(this);
 }
 public void onDestroy() {
   EventBus.getDefault().unregister(this);
   super.onDestroy();
 }
When to use EventBus
 Medium/high distance of components:
  “Somewhere” else should happen sth.
 Potentially multiple dependencies
 Asynchronous logic
 When not to use EventBus
  – Strictly internal matters:
    Use methods and interfaces instead
  – Inter-process communication
License, Contact
 This presentation is licensed under
  CreativeCommons ShareAlike/Attribution
 http://creativecommons.org/licenses/by-sa/3.0/


 Contact greenrobot
  – http://greenrobot.de
  – http://twitter.com/greenrobot_de
  – Google+: http://bit.ly/greenrobotplus

Contenu connexe

Tendances

Final rural-development-in-india
Final rural-development-in-indiaFinal rural-development-in-india
Final rural-development-in-india
maheshgautambsr
 
Challenges of urban Growth in India: By Anumita Roychowdhury
Challenges of urban Growth in India: By Anumita RoychowdhuryChallenges of urban Growth in India: By Anumita Roychowdhury
Challenges of urban Growth in India: By Anumita Roychowdhury
bmbks321
 
Singapore Experience in Water Financing
Singapore Experience in Water FinancingSingapore Experience in Water Financing
Singapore Experience in Water Financing
GWP SOUTHEAST ASIA
 

Tendances (20)

Ahmedabad cmp
Ahmedabad cmpAhmedabad cmp
Ahmedabad cmp
 
Final rural-development-in-india
Final rural-development-in-indiaFinal rural-development-in-india
Final rural-development-in-india
 
Mkt 460.4 group 1 cosco
Mkt 460.4 group 1 coscoMkt 460.4 group 1 cosco
Mkt 460.4 group 1 cosco
 
Amrut by Gajanand Ram (Town Planner)
Amrut  by Gajanand  Ram (Town Planner)Amrut  by Gajanand  Ram (Town Planner)
Amrut by Gajanand Ram (Town Planner)
 
Materi geopark
Materi geoparkMateri geopark
Materi geopark
 
Rural development
Rural developmentRural development
Rural development
 
Paparan Bappenas Capaian Nasional & Peran Pemda untuk SDGs.pptx
Paparan Bappenas Capaian Nasional & Peran Pemda untuk SDGs.pptxPaparan Bappenas Capaian Nasional & Peran Pemda untuk SDGs.pptx
Paparan Bappenas Capaian Nasional & Peran Pemda untuk SDGs.pptx
 
Amsterdam Smart City
Amsterdam Smart CityAmsterdam Smart City
Amsterdam Smart City
 
Challenges of urban Growth in India: By Anumita Roychowdhury
Challenges of urban Growth in India: By Anumita RoychowdhuryChallenges of urban Growth in India: By Anumita Roychowdhury
Challenges of urban Growth in India: By Anumita Roychowdhury
 
Gandhinagar Smart City
Gandhinagar Smart CityGandhinagar Smart City
Gandhinagar Smart City
 
WEBINAR: Transforming India's Urban Infrastructure with Project AMRUT (Atal M...
WEBINAR: Transforming India's Urban Infrastructure with Project AMRUT (Atal M...WEBINAR: Transforming India's Urban Infrastructure with Project AMRUT (Atal M...
WEBINAR: Transforming India's Urban Infrastructure with Project AMRUT (Atal M...
 
Sustainable Cities and Communities: UNSDG #11
Sustainable Cities and Communities: UNSDG #11Sustainable Cities and Communities: UNSDG #11
Sustainable Cities and Communities: UNSDG #11
 
Smartcity ahmedabad_smart_city_proposalsummary-converted
 Smartcity ahmedabad_smart_city_proposalsummary-converted Smartcity ahmedabad_smart_city_proposalsummary-converted
Smartcity ahmedabad_smart_city_proposalsummary-converted
 
Singapore Experience in Water Financing
Singapore Experience in Water FinancingSingapore Experience in Water Financing
Singapore Experience in Water Financing
 
NRLM
NRLMNRLM
NRLM
 
DEBANJALI SAHA- West Bengal Housing Policies and Schemes
DEBANJALI SAHA- West Bengal Housing Policies and SchemesDEBANJALI SAHA- West Bengal Housing Policies and Schemes
DEBANJALI SAHA- West Bengal Housing Policies and Schemes
 
Rural Infrastructure development and Technology misssions
Rural Infrastructure development and Technology misssionsRural Infrastructure development and Technology misssions
Rural Infrastructure development and Technology misssions
 
Trends of Urbanisation in Smart City of Faridabad: A Geographical Perspective
Trends of Urbanisation in Smart City of Faridabad: A Geographical PerspectiveTrends of Urbanisation in Smart City of Faridabad: A Geographical Perspective
Trends of Urbanisation in Smart City of Faridabad: A Geographical Perspective
 
Rural Planning and Development Programmes.pdf
Rural Planning and Development Programmes.pdfRural Planning and Development Programmes.pdf
Rural Planning and Development Programmes.pdf
 
Pengumuman Lulus Seleksi Penulisan Makalah
Pengumuman Lulus Seleksi Penulisan MakalahPengumuman Lulus Seleksi Penulisan Makalah
Pengumuman Lulus Seleksi Penulisan Makalah
 

Similaire à EventBus for Android

Event and Signal Driven Programming Zendcon 2012
Event and Signal Driven Programming Zendcon 2012Event and Signal Driven Programming Zendcon 2012
Event and Signal Driven Programming Zendcon 2012
Elizabeth Smith
 
Event and signal driven programming
Event and signal driven programmingEvent and signal driven programming
Event and signal driven programming
Elizabeth Smith
 
Swiss army knife Spring
Swiss army knife SpringSwiss army knife Spring
Swiss army knife Spring
Mario Fusco
 
Java event processing model in c# and java
Java  event processing model in c# and javaJava  event processing model in c# and java
Java event processing model in c# and java
Tech_MX
 

Similaire à EventBus for Android (20)

GreenRobot-Eventbus
GreenRobot-EventbusGreenRobot-Eventbus
GreenRobot-Eventbus
 
Event and Signal Driven Programming Zendcon 2012
Event and Signal Driven Programming Zendcon 2012Event and Signal Driven Programming Zendcon 2012
Event and Signal Driven Programming Zendcon 2012
 
Event and signal driven programming
Event and signal driven programmingEvent and signal driven programming
Event and signal driven programming
 
Java gui event
Java gui eventJava gui event
Java gui event
 
Event bus for android
Event bus for androidEvent bus for android
Event bus for android
 
Unit-3 event handling
Unit-3 event handlingUnit-3 event handling
Unit-3 event handling
 
Events: The Object Oriented Hook System.
Events: The Object Oriented Hook System.Events: The Object Oriented Hook System.
Events: The Object Oriented Hook System.
 
Swiss army knife Spring
Swiss army knife SpringSwiss army knife Spring
Swiss army knife Spring
 
Javascript Browser Events.pdf
Javascript Browser Events.pdfJavascript Browser Events.pdf
Javascript Browser Events.pdf
 
JEDI Slides-Intro2-Chapter20-GUI Event Handling.pdf
JEDI Slides-Intro2-Chapter20-GUI Event Handling.pdfJEDI Slides-Intro2-Chapter20-GUI Event Handling.pdf
JEDI Slides-Intro2-Chapter20-GUI Event Handling.pdf
 
Advance Java Programming(CM5I) Event handling
Advance Java Programming(CM5I) Event handlingAdvance Java Programming(CM5I) Event handling
Advance Java Programming(CM5I) Event handling
 
Dr Jammi Ashok - Introduction to Java Material (OOPs)
 Dr Jammi Ashok - Introduction to Java Material (OOPs) Dr Jammi Ashok - Introduction to Java Material (OOPs)
Dr Jammi Ashok - Introduction to Java Material (OOPs)
 
Ext Js Events
Ext Js EventsExt Js Events
Ext Js Events
 
Ext Js Events
Ext Js EventsExt Js Events
Ext Js Events
 
dSS API by example
dSS API by exampledSS API by example
dSS API by example
 
GWT MVP Case Study
GWT MVP Case StudyGWT MVP Case Study
GWT MVP Case Study
 
WPF Fundamentals
WPF FundamentalsWPF Fundamentals
WPF Fundamentals
 
Java event processing model in c# and java
Java  event processing model in c# and javaJava  event processing model in c# and java
Java event processing model in c# and java
 
Google Web Toolkits
Google Web ToolkitsGoogle Web Toolkits
Google Web Toolkits
 
A Series of Fortunate Events - PHP Benelux Conference 2015
A Series of Fortunate Events - PHP Benelux Conference 2015A Series of Fortunate Events - PHP Benelux Conference 2015
A Series of Fortunate Events - PHP Benelux Conference 2015
 

Dernier

Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 

Dernier (20)

Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
A Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source MilvusA Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source Milvus
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 

EventBus for Android

  • 1. EventBus for Android. droidcon NL 23.11.2012 Markus Junginger © Copyright 2012 Markus Junginger. All rights reserved.
  • 2.
  • 4. Status Quo in Android  Q: Who is talking to whom?
  • 5. Status Quo in Android Activity Activity Service / Helper Fragment Fragment Thread
  • 6. Communication Issues?!  Tight coupling of components  Inflexible, changes are expensive  Boiler plate code – Define interfaces – Callbacks for asynch. communication – Listener management – Propagation through all layers
  • 7. EventBus Communication Activity Activity Event Bus Service / Helper Fragment Fragment Thread
  • 8. EventBus for Android  Event-based Publish/Subscribe  Bus: central communication  Inspired by Guava„s EventBus (Google)  Android-optimized  Open Source, Apache 2 License https://github.com/greenrobot/EventBus
  • 9. EventBus in 4 Steps 1. Define an event 2. Register subscriber 3. Post an event 4. Receive the event
  • 10. EventBus in 4 Steps: Code! 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);
  • 11. Publish / Subscribe Subscriber Event Event Event onEvent() Publisher post() Bus Event Subscriber onEvent()
  • 12. EventBus Instances  EventBus instances  Instances are indepent from each other  For many apps, a single instance is fine  „Convenience“ Instance EventBus.getDefault()  Aquire it anywhere(!) in your code
  • 13. Event Handler Method: onEvent  EventBus scans subscribers – During (first) registration of subscriber – For event handler methods  Event handler methods – Naming convention: onEvent – public visibility – No return value (void) – Single parameter for the event to receive
  • 14. Type-based Event Routing  Event type: Java class of the event  To receive an event, its type must match  post(new MyEvent());  onEvent(MyEvent event) {…}  Type hierarchy of events – Implement logging of all events: onEvent(Object event)
  • 15. Event Type is a Filter Subscriber Event Event Event onEvent(MyEvent) Publisher post Bus (MyEvent) Subscriber onEvent(OtherEvent)
  • 16. It„s time to see some CODE
  • 17. EventBus Code: Sender MyEvent myEvent = new MyEvent(anyData); EventBus.getDefault().post(myEvent);
  • 18. EventBus Code: Receiver MyActivity extends Activity // no interf. // onCreate or onResume EventBus.getDefault().register(this); // onDestroy or onPause EventBus.getDefault().unregister(this); public onEvent(MyEvent event) { … }
  • 19. Example: Fragment to Fragment  Tap on one fragment  Another fragment reacts  Typical list/details scenario  Conventional setup: Activity Activity is managing Fragments Fragment Fragment
  • 20. Conventional: DetailFragment // Here‘s the action. How is it called? public void loadDetails(Item item) { … }
  • 21. Conventional: ListFragment interface Contract { void onItemSelected(Item item); } // Propagate to Activity ((Contract)getActivity()).onItemSelected(item);
  • 22. Conventional: Activity public class MyActivity implements ListFragment.Contract { public void onItemSelected(Item item) { DetailFragment detailFragment = (DetailFragment) getFragmentManager().findFragmentBy…; detailFragment.loadDetails(item); } }
  • 23. EventBus: Event class public class ItemSelectedEvent { public final Item item; public ItemSelectedEvent(Item item) { this.item = item; } }
  • 24. EventBus: Post & Receive // In ListFragment EventBus.getDefault().post(new ItemSelectedEvent(item)); // In DetailFragment (extends EventBusFragment) public void onEvent(ItemSelectedEvent event) { … }
  • 25. Event Delivery in other Threads THREADING SUPPORT
  • 26. Why do Threads matter?  Responsive UI, Android conventions – Main/UI thread must not block – UI updates in the main thread – Networking etc. in background threads  Threads and Events – Thread posting events – Thread handling events – Posting and handling thread may differ
  • 27. EventBus Threading Support  Event delivery using threads  Event handler method decides (handler knows best what it is doing)  Naming conventions for onEvent methods  To deliver in the main thread: onEventMainThread(…)  (All methods beginning with onEvent are checked for typos)
  • 28. 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
  • 29. Threading Example  Network thread posts result post(new UserLoginEvent(name));  Fragment reacts to event in main thread public void onEventMainThread(UserLoginEvent e) { textView.setText(e.getName()); }
  • 30. Asynchronous execution and error dialogs SNEAK PREVIEW
  • 31. Upcoming: EventBus 2.1  EventBus 2.1 is not final yet; Still gathering experience and feedback  Everything pushed to master branch  No relevant changes in the core (planned)  Comes with some helpers – AsyncExecutor – Error dialog
  • 32. EventBus 2.1: AsyncExecutor  A thread pool, but with failure handling  RunnableEx interface – Like Runnable to define code to run async. – May throw any execption  ThrowableFailureEvent – Posted when exception occurs – Throwable object is wrapped inside – Subclass to customize and filter for type
  • 33. AsyncExecutor: Calling Code AsyncExecutor.create().execute( new RunnableEx { public void run throws LoginException { remote.login(); EventBus.getDefault().postSticky( new LoggedInEvent()); // No need to catch Exception } } }
  • 35. Comparison to AsyncTask  AsyncExecutor advantages – Don‟t worry about configuration changes (typically device rotation) – Failure handling – EventBus (other dependencies somewhere?)  AsyncTask advantage – Canceling task
  • 36. EventBus 2.1: Error Dialog  Operations may fail (networking, etc.)  Some UI response should be shown – Currently: error dialogs – Later: Possibly maybe someth. Crouton-ish  Multiple errors: don‟t open multiple times  Goal: Minimize required code
  • 37. How Error Dialogs work  Error handling “attaches” to Activities  Displaying dialogs is triggered by events  ThrowableFailureEvent or subclass – AsyncExecutor sends those – Or post those events manually
  • 38. Error Dialogs: Code // In onCreate in your Activity ErrorDialogManager.attachTo(this); // Trigger the dialog bus.post(new ThrowableFailureEvent(ex)); // Or let AsyncExecutor do it for you…
  • 39. Dialog Configuration  Which texts to display in the dialog?  Simple option: Configure – Supply default resources for title and text – Map exception types  texts  Flexible option: extend ErrorDialogFragmentFactory
  • 40. Dialog Configuration: Code // Initialize in your Application class ErrorDialogConfig config = new ErrorDialogConfig(getResources(), R.string.error_generalTitle, R.string.error_general); config.addMapping(UnknownHostException.class, R.string.error_noInternetConnection); config.addMapping(IOException.class, R.string.error_generalServer); ErrorDialogManager.factory = new ErrorDialogFragmentFactory.Support(config);
  • 41. Comparison Android Broadcast  Nice, but somewhat inconvenient  BroadcastReceiver has to be extended  Registration needed for every event type  Extra work to filter for desired event types (IntentFilter with e.g. ACTION String)  Data is converted into Intent extras
  • 42. Tiny bits and some other stuff TIPPS AND SNIPPS
  • 43. Sticky Events  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)
  • 44. Events Class  Event classes are tiny; group them public class Events { public static class InitThreadCompleteEvent { } public static class LoginCompleteEvent { } }
  • 45. EventBusFragment/-Activity  Superclass depends on your setup  Implement in your project class EventBusFragment extends Fragment { public void onCreate(…) { super.onCreate(…); EventBus.getDefault().register(this); } public void onDestroy() { EventBus.getDefault().unregister(this); super.onDestroy(); }
  • 46. When to use EventBus  Medium/high distance of components: “Somewhere” else should happen sth.  Potentially multiple dependencies  Asynchronous logic  When not to use EventBus – Strictly internal matters: Use methods and interfaces instead – Inter-process communication
  • 47. License, Contact  This presentation is licensed under CreativeCommons ShareAlike/Attribution http://creativecommons.org/licenses/by-sa/3.0/  Contact greenrobot – http://greenrobot.de – http://twitter.com/greenrobot_de – Google+: http://bit.ly/greenrobotplus