2014-04-04 10 views
43

Io sono un grande fan di aperta piazza contributi fonte ha fatto per la comunità Android e guardava nel loro ultimo contributo Otto (bus evento)Otto vs LocalBroadcast:

http://square.github.io/otto/

Scavando più a fondo vedo che Otto usa la riflessione e non c'è trasmissione ordinata (un modello in cui un messaggio non consumato viene trasmesso da un ricevitore al ricevitore successivo che ascolta sullo stesso tipo di evento) Otto crede in un modello più incendiario e dimentico.

Ora Android ha LocalBroadcastManager (LBM) nella sua libreria di supporto v4 che ha lo stesso scopo, anche se è più ingombrante e ha più restrizioni sugli oggetti che vengono passati. Ma sul lato più luminoso supporta la trasmissione ordinata ed è più simile alla normale trasmissione.

Sia Otto che LBM si trovano nello stesso spazio di processo, quindi in termini di velocità suppongo che entrambi sarebbero uguali. L'unica vera differenza che ho potuto vedere è che Otto ti permette di definire eventi personalizzati e non devi serializzare/pacchi gli oggetti.

Quindi la mia vera domanda è quando useresti Otto se LBM fa le stesse cose.

Riferimenti:

http://nick.perfectedz.com/otto-event-system/

Using Intents or an event bus to communicate within the same app

https://plus.google.com/107049228697365395345/posts/6j4ANWngCUY

risposta

36

Ma il lato più luminoso lo fa il supporto ordinato trasmesso

Non

veramente. Non c'è sendOrderedBroadcast() su LocalBroadcastManager e la priorità su IntentFilter non sembra essere utilizzata. Se intendi "le trasmissioni verranno consegnate nell'ordine in cui ho registrato i ricevitori", questo potrebbe essere il comportamento corrente, ma non vi è alcuna garanzia che rimanga tale.

Sia Otto e LBM sono all'interno dello stesso spazio di processo così in termini di velocità immagino entrambi sarebbe stessa

Sarebbero simile, anche se probabilmente non identici.

Da qui la mia vera domanda è quando si usa Otto se LBM fa le stesse cose

Confrontando quei due, Otto ha un'API più pulito, IMHO.

Personalmente, vorrei usare greenrobot's EventBus su uno di questi, perché offre modelli di threading più flessibili.

+0

Sì mi correggo, non c'è sendOrderedBroadcast() su LBM, Relativo il senso I Registro ricevitori. Daremo un'occhiata anche a eventrobus di greenrobot. Grazie per il suggerimento – Chris

+0

GreenRobot sembra davvero interessante, specialmente la parte post-adesiva. lo consiglieresti per risolvere i problemi di orientamento cambiato? per esempio per assicurarti che l'attività ottenga sempre il risultato di un servizio dopo che la ricreazione è stata completata? un semplice esempio sarebbe quello di aggiungere una chiamata di servizio a una coda usando la scarica per recuperare alcuni dati, dopodiché ruoto il dispositivo ... quindi il risultato di volley viene restituito e pubblicato usando greenrobot come trasmissione appiccicosa, mentre la mia attività non è ancora stata creata (in fase di riavvio) l'attività viene riavviata e quindi è possibile recuperare i dati necessari. pensi che questo sia legittimo? –

+0

@NaderAyyad: se l'attività riceverebbe questi dati dal servizio tramite i messaggi EventBus, gli eventi persistenti potrebbero essere utili per le modifiche alla configurazione. – CommonsWare

5

Sia Otto e LBM sono all'interno dello stesso spazio di processo così in termini di velocità immagino entrambi sarebbe stessa.

Ho scoperto che registrano gli eventi Otto sono piuttosto costosi, a volte ci vuole più di 16 millisecondi per registrare sottoscrittori di eventi (Ciò significa che si goccia 1 FPS!). Questo è in qualche modo previsto, poiché l'evento che si iscrive ad Otto è fatto per riflessione. Mentre per LBM, ci vogliono solo poche centinaia di μs solo per la registrazione, che è quasi 32 volte più veloce. (Risultato da traceview, Samsung Galaxy S4)

Ma ovviamente, utilizzando Otto è possibile scrivere meno codice, c'è un compromesso.

0
  1. otto rende più pulito il codice, minore
  2. otto rende il test più facile
Problemi correlati