Android
GreenRobot EventBus
Zoeken…
Syntaxis
- @Subscribe (threadMode = ThreadMode.POSTING) public void onEvent (EventClass-evenement) {}
parameters
Thread Mode | Beschrijving |
---|---|
ThreadMode.POSTING | Wordt opgeroepen op dezelfde thread waarop het evenement is gepost. Dit is de standaardmodus. |
ThreadMode.MAIN | Wordt aangeroepen op de hoofdthread van de gebruikersinterface. |
ThreadMode.BACKGROUND | Wordt opgeroepen op een achtergrondthread. Als de berichtthread niet de hoofdthread is, wordt deze gebruikt. Indien gepost op de EventBus heeft EventBus een enkele achtergrondthread die het zal gebruiken. |
ThreadMode.ASYNC | Zal op zijn eigen draad worden genoemd. |
Een gebeurtenisobject maken
Voor het verzenden en ontvangen van evenementen hebben we eerst een Event-object nodig. Gebeurtenisobjecten zijn eigenlijk eenvoudige POJO's.
public class ArbitaryEvent{
public static final int TYPE_1 = 1;
public static final int TYPE_2 = 2;
private int eventType;
public ArbitaryEvent(int eventType){
this.eventType = eventType;
}
public int getEventType(){
return eventType;
}
}
Evenementen ontvangen
Voor het ontvangen van evenementen moet u uw klas registreren op de EventBus
.
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
En abonneer je dan op de evenementen.
@Subscribe(threadMode = ThreadMode.MAIN)
public void handleEvent(ArbitaryEvent event) {
Toast.makeText(getActivity(), "Event type: "+event.getEventType(), Toast.LENGTH_SHORT).show();
}
Evenementen verzenden
Gebeurtenissen verzenden is net zo eenvoudig als het gebeurtenisobject maken en vervolgens posten.
EventBus.getDefault().post(new ArbitaryEvent(ArbitaryEvent.TYPE_1));
Een eenvoudig evenement passeren
Het eerste dat we moeten doen, is EventBus toevoegen aan het gradle-bestand van onze module:
dependencies {
...
compile 'org.greenrobot:eventbus:3.0.0'
...
}
Nu moeten we een model maken voor ons evenement. Het kan alles bevatten wat we willen doorgeven. Voor nu maken we gewoon een lege klas.
public class DeviceConnectedEvent
{
}
Nu kunnen we de code toevoegen aan onze Activity
die zich registreert bij EventBus en zich abonneert op het evenement.
public class MainActivity extends AppCompatActivity
{
private EventBus _eventBus;
@Override
protected void onCreate (Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
_eventBus = EventBus.getDefault();
}
@Override
protected void onStart ()
{
super.onStart();
_eventBus.register(this);
}
@Override
protected void onStop ()
{
_eventBus.unregister(this);
super.onStop();
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onDeviceConnected (final DeviceConnectedEvent event)
{
// Process event and update UI
}
}
In deze Activity
krijgen we een exemplaar van EventBus
in de methode onCreate()
. We registreren / afmelden voor evenementen in onStart()
/ onStop()
. Het is belangrijk om te onthouden dat u zich afmeldt wanneer uw luisteraar zijn bereik verliest of dat u uw Activity
kunt lekken.
Ten slotte definiëren we de methode die we bij de gebeurtenis willen gebruiken. De annotatie @Subscribe
vertelt EventBus welke methoden het kan zoeken om evenementen af te handelen. Je moet ten minste één methode hebben geannoteerd met @Subscribe
om je te registreren bij EventBus, anders zal er een uitzondering optreden. In de annotatie definiëren we de threadmodus. Dit vertelt EventBus op welke thread de methode moet worden ingeschakeld. Het is een zeer handige manier om informatie van een achtergrondthread naar de UI-thread door te geven! Dat is precies wat we hier doen. ThreadMode.MAIN
betekent dat deze methode wordt aangeroepen in de belangrijkste UI-thread van Android, dus het is veilig om hier alle UI-manipulaties uit te voeren die u nodig hebt. De naam van de methode doet er niet toe. De enige gedachte, behalve dat de annotatie @Subscribe
, waar EventBus naar op zoek is, is het type argument. Zolang het type overeenkomt, wordt het aangeroepen wanneer een evenement wordt geplaatst.
Het laatste wat we moeten doen om een evenement te plaatsen. Deze code staat in onze Service
.
EventBus.getDefault().post(new DeviceConnectedEvent());
Dat is alles wat er is! EventBus neemt dat DeviceConnectedEvent en doorloopt zijn geregistreerde luisteraars, doorzoekt de methoden waarop ze zich hebben geabonneerd en vindt degene die een DeviceConnectedEvent als argument gebruiken en roept ze op de draad waarop ze willen worden opgeroepen.