SlideShare a Scribd company logo
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

More Related Content

What's hot

Pra você o que significa o dia da consciência negra?
Pra você o que significa o dia da consciência negra?Pra você o que significa o dia da consciência negra?
Pra você o que significa o dia da consciência negra?
Universidade Estadual da Paraíba (UEPB)
 
Violência contra a mulher
Violência contra a mulherViolência contra a mulher
Violência contra a mulher
Ketlin Stringhini
 
Arquitetura Cliente-Servidor - Banco de dados
Arquitetura Cliente-Servidor - Banco de dadosArquitetura Cliente-Servidor - Banco de dados
Arquitetura Cliente-Servidor - Banco de dados
Israel Messias
 
Anorexia e Bulimia
Anorexia e BulimiaAnorexia e Bulimia
Anorexia e BulimiaMichele Pó
 
Violência contra mulher -
Violência contra mulher - Violência contra mulher -
Violência contra mulher -
Conceição Amorim
 
Banco de Dados em Grafos com Neo4J
Banco de Dados em Grafos com Neo4J  Banco de Dados em Grafos com Neo4J
Banco de Dados em Grafos com Neo4J
Daniel San Martin
 
ASPECTOS NUTRICIONAIS NO ENVELHECIMENTO
ASPECTOS NUTRICIONAIS NO ENVELHECIMENTOASPECTOS NUTRICIONAIS NO ENVELHECIMENTO
ASPECTOS NUTRICIONAIS NO ENVELHECIMENTO
Centro Universitário Ages
 
Requisitos Nao Funcionais
Requisitos Nao FuncionaisRequisitos Nao Funcionais
Requisitos Nao Funcionaisguesta36ce2
 
Cultura e sexualidade resumo
Cultura e sexualidade resumoCultura e sexualidade resumo
Cultura e sexualidade resumo
Tradicao Viva
 
Lista material esportivo
Lista material esportivoLista material esportivo
Lista material esportivo
Município de Galinhos
 

What's hot (11)

Pra você o que significa o dia da consciência negra?
Pra você o que significa o dia da consciência negra?Pra você o que significa o dia da consciência negra?
Pra você o que significa o dia da consciência negra?
 
Violência contra a mulher
Violência contra a mulherViolência contra a mulher
Violência contra a mulher
 
Apresentação luciana
Apresentação lucianaApresentação luciana
Apresentação luciana
 
Arquitetura Cliente-Servidor - Banco de dados
Arquitetura Cliente-Servidor - Banco de dadosArquitetura Cliente-Servidor - Banco de dados
Arquitetura Cliente-Servidor - Banco de dados
 
Anorexia e Bulimia
Anorexia e BulimiaAnorexia e Bulimia
Anorexia e Bulimia
 
Violência contra mulher -
Violência contra mulher - Violência contra mulher -
Violência contra mulher -
 
Banco de Dados em Grafos com Neo4J
Banco de Dados em Grafos com Neo4J  Banco de Dados em Grafos com Neo4J
Banco de Dados em Grafos com Neo4J
 
ASPECTOS NUTRICIONAIS NO ENVELHECIMENTO
ASPECTOS NUTRICIONAIS NO ENVELHECIMENTOASPECTOS NUTRICIONAIS NO ENVELHECIMENTO
ASPECTOS NUTRICIONAIS NO ENVELHECIMENTO
 
Requisitos Nao Funcionais
Requisitos Nao FuncionaisRequisitos Nao Funcionais
Requisitos Nao Funcionais
 
Cultura e sexualidade resumo
Cultura e sexualidade resumoCultura e sexualidade resumo
Cultura e sexualidade resumo
 
Lista material esportivo
Lista material esportivoLista material esportivo
Lista material esportivo
 

Similar to EventBus for Android

GreenRobot-Eventbus
GreenRobot-EventbusGreenRobot-Eventbus
GreenRobot-Eventbus
Himanshu Dudhat
 
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 2012Elizabeth Smith
 
Event and signal driven programming
Event and signal driven programmingEvent and signal driven programming
Event and signal driven programmingElizabeth Smith
 
Java gui event
Java gui eventJava gui event
Java gui event
SoftNutx
 
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
Amol Gaikwad
 
Events: The Object Oriented Hook System.
Events: The Object Oriented Hook System.Events: The Object Oriented Hook System.
Events: The Object Oriented Hook System.
Nida Ismail Shah
 
Swiss army knife Spring
Swiss army knife SpringSwiss army knife Spring
Swiss army knife SpringMario Fusco
 
Javascript Browser Events.pdf
Javascript Browser Events.pdfJavascript Browser Events.pdf
Javascript Browser Events.pdf
ShubhamChaurasia88
 
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
MarlouFelixIIICunana
 
Advance Java Programming(CM5I) Event handling
Advance Java Programming(CM5I) Event handlingAdvance Java Programming(CM5I) Event handling
Advance Java Programming(CM5I) Event handling
Payal Dungarwal
 
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)
jammiashok123
 
Ext Js Events
Ext Js EventsExt Js Events
Ext Js Events
jason hu 金良胡
 
Ext Js Events
Ext Js EventsExt Js Events
Ext Js Events
jason hu 金良胡
 
GWT MVP Case Study
GWT MVP Case StudyGWT MVP Case Study
GWT MVP Case Study
David Chandler
 
WPF Fundamentals
WPF FundamentalsWPF Fundamentals
WPF Fundamentals
Our Community Exchange LLC
 
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 javaTech_MX
 
Google Web Toolkits
Google Web ToolkitsGoogle Web Toolkits
Google Web Toolkits
Yiguang Hu
 
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
Matthias Noback
 

Similar to 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
 

Recently uploaded

Secstrike : Reverse Engineering & Pwnable tools for CTF.pptx
Secstrike : Reverse Engineering & Pwnable tools for CTF.pptxSecstrike : Reverse Engineering & Pwnable tools for CTF.pptx
Secstrike : Reverse Engineering & Pwnable tools for CTF.pptx
nkrafacyberclub
 
How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...
Product School
 
When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...
Elena Simperl
 
Elevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object CalisthenicsElevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object Calisthenics
Dorra BARTAGUIZ
 
Assure Contact Center Experiences for Your Customers With ThousandEyes
Assure Contact Center Experiences for Your Customers With ThousandEyesAssure Contact Center Experiences for Your Customers With ThousandEyes
Assure Contact Center Experiences for Your Customers With ThousandEyes
ThousandEyes
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
Kari Kakkonen
 
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdfFIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance
 
Introduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - CybersecurityIntroduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - Cybersecurity
mikeeftimakis1
 
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdfFIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance
 
Bits & Pixels using AI for Good.........
Bits & Pixels using AI for Good.........Bits & Pixels using AI for Good.........
Bits & Pixels using AI for Good.........
Alison B. Lowndes
 
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdfFIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance
 
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdfFIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance
 
PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)
Ralf Eggert
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
Alan Dix
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
Laura Byrne
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
Ana-Maria Mihalceanu
 
PCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase TeamPCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase Team
ControlCase
 
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Product School
 
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Ramesh Iyer
 

Recently uploaded (20)

Secstrike : Reverse Engineering & Pwnable tools for CTF.pptx
Secstrike : Reverse Engineering & Pwnable tools for CTF.pptxSecstrike : Reverse Engineering & Pwnable tools for CTF.pptx
Secstrike : Reverse Engineering & Pwnable tools for CTF.pptx
 
How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...
 
When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...
 
Elevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object CalisthenicsElevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object Calisthenics
 
Assure Contact Center Experiences for Your Customers With ThousandEyes
Assure Contact Center Experiences for Your Customers With ThousandEyesAssure Contact Center Experiences for Your Customers With ThousandEyes
Assure Contact Center Experiences for Your Customers With ThousandEyes
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
 
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdfFIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdf
 
Introduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - CybersecurityIntroduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - Cybersecurity
 
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdfFIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
 
Bits & Pixels using AI for Good.........
Bits & Pixels using AI for Good.........Bits & Pixels using AI for Good.........
Bits & Pixels using AI for Good.........
 
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdfFIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
 
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdfFIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
 
PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
 
PCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase TeamPCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase Team
 
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
 
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
 

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