Android
EventBus di GreenRobot
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.