Android
GreenRobot EventBus
Sök…
Syntax
- @Subscribe (threadMode = ThreadMode.POSTING) public void onEvent (EventClass event) {}
parametrar
Trådläge | Beskrivning |
---|---|
ThreadMode.POSTING | Kommer att kallas på samma tråd som händelsen postades på. Detta är standardläget. |
ThreadMode.MAIN | Kommer att kallas på huvudgränssnittet. |
ThreadMode.BACKGROUND | Kommer att kallas på en bakgrundstråd. Om publiceringstråden inte är huvudtråden kommer den att användas. Om den är publicerad på EventBus har EventBus en enda bakgrundstråd som den kommer att använda. |
ThreadMode.ASYNC | Kommer att kallas på sin egen tråd. |
Skapa ett händelseobjekt
För att skicka och ta emot händelser behöver vi först ett händelseobjekt. Händelseobjekt är faktiskt enkla POJO: er.
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;
}
}
Ta emot händelser
För att ta emot evenemang måste du registrera din klass på EventBus
.
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
Och prenumerera sedan på händelserna.
@Subscribe(threadMode = ThreadMode.MAIN)
public void handleEvent(ArbitaryEvent event) {
Toast.makeText(getActivity(), "Event type: "+event.getEventType(), Toast.LENGTH_SHORT).show();
}
Skicka händelser
Att skicka händelser är lika enkelt som att skapa händelseobjektet och sedan posta det.
EventBus.getDefault().post(new ArbitaryEvent(ArbitaryEvent.TYPE_1));
Att passera en enkel händelse
Det första vi behöver göra för att lägga till EventBus i vår moduls gradfil:
dependencies {
...
compile 'org.greenrobot:eventbus:3.0.0'
...
}
Nu måste vi skapa en modell för vårt evenemang. Det kan innehålla allt vi vill gå med. För nu gör vi bara en tom klass.
public class DeviceConnectedEvent
{
}
Nu kan vi lägga till koden till vår Activity
som kommer att registreras hos EventBus och prenumerera på händelsen.
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
}
}
I den här Activity
vi ett exempel på EventBus
i onCreate()
. Vi registrerar / avregistrerar för evenemang i onStart()
/ onStop()
. Det är viktigt att komma ihåg att avregistrera när din lyssnare förlorar omfattningen eller om du kan läcka din Activity
.
Slutligen definierar vi den metod som vi vill ha kallat för händelsen. @Subscribe
anteckningen berättar EventBus vilka metoder den kan leta efter för att hantera händelser. Du måste ha minst en metod kommenterad med @Subscribe
att registrera dig på EventBus, annars kommer det att undvika. I anteckningen definierar vi trådläget. Detta berättar EventBus vilken tråd att använda metoden på. Det är ett mycket praktiskt sätt att överföra information från en bakgrundstråd till UI-tråden! Det är precis vad vi gör här. ThreadMode.MAIN
betyder att den här metoden kommer att anropas på Android: s huvudgränssnitt för UI, så det är säkert att göra alla UI-manipulationer som du behöver. Metodens namn spelar ingen roll. Det enda tänkande, annat som @Subscribe
anteckningen, som EventBus letar efter är typen av argument. Så länge typen matchar kommer den att ringas när en händelse publiceras.
Det sista vi behöver göra för att publicera ett evenemang. Den här koden finns i vår Service
.
EventBus.getDefault().post(new DeviceConnectedEvent());
Det är allt du behöver! EventBus kommer att ta det DeviceConnectedEvent och titta igenom dess registrerade lyssnare, titta igenom metoderna som de har prenumererat och hitta de som tar DeviceConnectedEvent som ett argument och kalla dem på tråden som de vill kallas på.