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.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow