Ricerca…


Sintassi

  • @Subscribe (threadMode = ThreadMode.POSTING) public void onEvent (EventClass event) {}

Parametri

Modalità discussione Descrizione
ThreadMode.POSTING Sarà chiamato sullo stesso thread su cui è stato pubblicato l'evento. Questa è la modalità di default.
ThreadMode.MAIN Sarà chiamato sul thread principale dell'interfaccia utente.
ThreadMode.BACKGROUND Sarà chiamato su un thread in background. Se il thread di pubblicazione non è il thread principale, verrà utilizzato. Se pubblicato sul thread principale, EventBus ha un singolo thread in background che utilizzerà.
ThreadMode.ASYNC Sarà chiamato sul proprio thread.

Creare un oggetto Event

Per inviare e ricevere eventi abbiamo prima bisogno di un oggetto Event. Gli oggetti evento sono in realtà POJO semplici.

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;
    }
}

Ricevere eventi

Per ricevere eventi è necessario registrare la propria lezione su EventBus .

@Override
public void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
}

@Override
public void onStop() {
   EventBus.getDefault().unregister(this);
   super.onStop();
}

E poi iscriviti agli eventi.

@Subscribe(threadMode = ThreadMode.MAIN)
public void handleEvent(ArbitaryEvent event) {
    Toast.makeText(getActivity(), "Event type: "+event.getEventType(), Toast.LENGTH_SHORT).show();
}

Invio di eventi

L'invio di eventi è facile come creare l'oggetto Event e quindi pubblicarlo.

EventBus.getDefault().post(new ArbitaryEvent(ArbitaryEvent.TYPE_1));

Passando un semplice evento

La prima cosa che dobbiamo fare è aggiungere EventBus al file gradle del nostro modulo:

dependencies {
    ...
    compile 'org.greenrobot:eventbus:3.0.0'
    ...
}

Ora dobbiamo creare un modello per il nostro evento. Può contenere tutto ciò che vogliamo passare. Per ora faremo solo una lezione vuota.

public class DeviceConnectedEvent
{
}

Ora possiamo aggiungere il codice alla nostra Activity che si registrerà con EventBus e si iscriverà all'evento.

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 questa Activity ottiene un'istanza di EventBus nel metodo onCreate() . Registriamo / onStart() registrazione per gli eventi in onStart() / onStop() . È importante ricordare di annullare la registrazione quando l'ascoltatore perde l'ambito o si potrebbe perdere l' Activity .

Infine definiamo il metodo che vogliamo chiamare con l'evento. L'annotazione @Subscribe indica a EventBus quali metodi può cercare per gestire gli eventi. Devi avere almeno un metodo annotato con @Subscribe per registrarti con EventBus o genererà un'eccezione. Nell'annotazione definiamo la modalità thread. Questo dice a EventBus su quale thread chiamare il metodo. È un modo molto pratico per passare informazioni da un thread in background al thread dell'interfaccia utente! Questo è esattamente quello che stiamo facendo qui. ThreadMode.MAIN significa che questo metodo verrà chiamato sul thread principale dell'interfaccia utente di Android, quindi è sicuro fare qualsiasi manipolazione dell'interfaccia utente qui di cui hai bisogno. Il nome del metodo non ha importanza. L'unica cosa da pensare, altro che l'annotazione @Subscribe , che EventBus sta cercando è il tipo dell'argomento. Finché il tipo corrisponde verrà chiamato quando viene pubblicato un evento.

L'ultima cosa che dobbiamo fare per pubblicare un evento. Questo codice sarà nel nostro Service .

EventBus.getDefault().post(new DeviceConnectedEvent());

Questo è tutto ciò che c'è da fare! EventBus prenderà quel DeviceConnectedEvent e guarderà attraverso i suoi listener registrati, controllerà i metodi che hanno sottoscritto e troverà quelli che prendono un DeviceConnectedEvent come argomento e li chiamano sul thread su cui vogliono essere chiamati.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow