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å.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow