Android EventBus

EventBus libreria OpenSource per comunicare tra Fragment,Service,Worker ecc..

EventBus e’ una libreria che permette di comunicare un evento in maniera indipendente,senza avere nessuna relazione stretta tra activity ,fragment ,service,worker ecc…

Come funziona

La prima cosa e’ usare la libreria ,quindi nel gradle app mettiamo la seguente istruzione:implementation 'org.greenrobot:eventbus:3.0.0'

L’Evento

L’evento puo’ essere una classe di questo tipo:
public class MioEvento{
String data;
public String getData() {
return data;
}
public MioEvento(String data){
this.data=data;
}
}

Spediamo l’evento

Per spedire l’evento non dobbiamo far altro che scrivere solo questa riga di codice:
EventBus.getDefault().post(new MioEvento("dati evento"));

LEGGIAMO L’EVENTO

Per leggere l’evento dobbiamo registrarci al servizio offertoci dalla libreria e quindi se ad esempio usiamo un activity
dobbiamo registrarci quando l’activity è visibile ,ma dobbiamo ricordarci di cancellare il servizio una volta che l’activity non è più visibile.E quindi il codice sara’:
public class EventBusActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_eventbus);

}
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
public void onStop(){
super.onStop();
EventBus.getDefault().unregister(this);
}
//in questo metodo ricevo l'evento
@Subscribe
public void eventoRicevuto( MioEvento event){
textView.setText(event.data);
}
}

UN VANTAGGIO

A differenza di altre tecniche(messaggi,interfacce,ecc..),il vantaggio sta nel fatto che una volta spedito l’evento,questi può essere ricevuto da piu’ componenti android,inserendo l’ultimo metodo con @Subscribe.

EventBus lavora con i Thread

ThreadMode.Posting

Questo modo di trasmettere e’ quello di default.La trasmissione avviene sullo stesso thread e quindi dovrebbe essere la piu’ veloce ,gli eventi vengono trasmessi in modo sincrono,questo vuol dire che il successivo viene trasmesso solo quando il precedente e’ stato inviato.Da qui si capisce che l’elaborazione dell’evento dovrebbe durare poco,per non far affossare l’elaborazione.

@Subscribe(threadMode = ThreadMode.POSTING)
public void eventoRicevuto( MioEvento event){
Toast.makeText(this,"Evento ricevuto",Toast.LENGTH_SHORT).show();
}

ThreadMode.MAIN

Questa modalità di ricezione e’ simile all precedente,il Thread su cui avviene la trasmissione e’ quello principale
@Subscribe(threadMode = ThreadMode.MAIN)
public void eventoRicevuto( MioEvento event){
Toast.makeText(this,"Evento ricevuto",Toast.LENGTH_SHORT).show();
}

ThreadMode.Background

Questa modalità prevede che la ricezione avvenga un un Thread in background,e se la ricezione avviene in un componente dove gira in Thread principale,la ricezione avverra’ in un thread separato.Anche qui gli eventi saranno sincroni,tocca far attenzione che l’elaborazione dell’ evento duri poco,ma… allora non puo’ essere usata una modalità dove l’elaborazione dell’evento duri di più? Certo! Lo vedremo in seguito
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void eventoRicevuto( MioEvento event){
Toast.makeText(this,"Evento ricevuto",Toast.LENGTH_SHORT).show();
}

ThreadMode.Async

In questo metodo la comunicazione avviene su due Thread diversi,e quindi non e’ necessario stare attenti al tempo di elaborazione dell’evento,ovviamente la sequenzialità dell’evento non è più garantita.
@Subscribe(threadMode = ThreadMode.ASYNC)
public void eventoRicevuto( MioEvento event){
Toast.makeText(this,"Evento ricevuto",Toast.LENGTH_SHORT).show();
}

cancelliamo l’evento

Quando l’evento non e’ più utile lo cancelleremo così:
@Subscribe(threadMode = ThreadMode.ASYNC)
public void eventoRicevuto( MioEvento event){
EventBus.getDefault().cancelEventDelivery(event);
}