2015-03-24 11 views
19

Qual è il posto migliore per il registro e annullare la registrazione di in un bus eventi (come otto, EventBus o tinybus) in un'attività e perché?Quali sono i metodi migliori per registrare/annullare la registrazione dell'attività sul ciclo di eventi?

  1. onCreate() - OnDestroy()
  2. onStart() - onStop()
  3. onResume() - onPause() esempio

di Otto utilizza onResume() - onPause(), EventBus menziona onStart() - onStop(), e dovevamo usare onCreate() - onDestroy() nella nostra app per aggiornare l'interfaccia utente dell'attività anche quando era in background. Quindi immagino che possa essere uno qualsiasi dei tre a seconda della natura degli eventi e della loro gestione, ma mi stavo chiedendo se ci sia qualcosa di più che dovrebbe essere considerato.

+1

Ho bisogno di usare anche 'onCreate() - onDestroy()'. Hai trovato degli svantaggi? – aandis

+1

@zack, no non ho trovato alcun inconveniente al momento, ma era solo un'app PoC, quindi non era una vasta esperienza – levavare

+0

@levavare, Si prega di contrassegnare una delle risposte qui sotto come accettate. Sembra che tu abbia deciso di essere d'accordo con la risposta/link di Jordy, ma questo non ha il maggior numero di uptotes, quindi è più difficile da trovare. –

risposta

6

@levavare, penso che il momento giusto per registrare/annullare la registrazione dipende dalle vostre eventi e cosa si intende fare con loro. E può essere diverso per diversi eventi all'interno della stessa applicazione.

Ad esempio, sto utilizzando EventBus in un'app Android che monitora un dispositivo di registrazione dei dati in tempo reale (Arduino, in questo caso) tramite Bluetooth. Ho due tipi di eventi molto diversi.

Il primo evento è registrato dal mio codice Bluetooth per notificare a uno dei miei frammenti che è stato ricevuto un nuovo set di letture dello strumento dal dispositivo. Quel frammento poi li scrive su una tabella di database. È importante che l'evento sia sempre ascoltato e messo in pratica. Il frammento registra/non registra nei suoi metodi OnCreate/OnDestroy. Mi iscrivo anche a quell'evento con priorità elevata.

L'altro evento viene registrato dal livello del database quando il nuovo record viene aggiunto al database. Ho una serie di frammenti che mostrano diversi sottoinsiemi delle letture (temperature, pressioni, condizioni di allarme). Quando uno di questi frammenti viene visualizzato, dovrebbe essere aggiornato non appena la nuova lettura si trova nel database. Ma quando il frammento è fuori dalla vista, non c'è motivo per farlo agire in una lettura. Ho quei frammenti registrati/non registrati in OnStart/OnStop. Stavo andando a fare quel lavoro su OnResume/OnPause e, francamente, penso che avrebbe funzionato anche lì per la mia app. Ma la risposta e il collegamento di @ Jordy mi hanno convinto ad andare su OnStart/OnStop.

12

Prima di tutto, la sua non una domanda oggettiva è piuttosto soggettiva e trarrà molti argomenti basati su argomenti.

Dalla mia esperienza, Abbiamo usato Otto in uno dei nostri progetti. Abbiamo seguito onResume() - onPause() che ci è servito molto bene. Ha anche senso perché dovremmo registrarci il più tardi possibile & deregister il più velocemente possibile mentre si utilizza un bus eventi.

+0

"il più tardi possibile e cancella il più velocemente possibile" - grazie, buon punto, ha un senso anche dal punto di vista delle prestazioni della distribuzione degli eventi, suppongo, anche se non sono sicuro di quanto effettivamente conta. Ma penso che partire da onResume-onPause e spostarsi 'su' se necessario ha senso. – levavare

+0

sì. salire secondo lo scenario è la tattica migliore che penso. La prego di accettare la risposta, se serve al tuo scopo? –

+18

che dire di perdere gli eventi inviati mentre l'app era in background? – gyosida

3

Ho rimosso il mio commento nella risposta di cui sopra che sarebbe meglio registrare/annullare la registrazione in onresume/onpause. Ho avuto uno strano caso in cui alcuni se i miei eventi non raggiungevano l'iscritto annotato. Sembra che il modo migliore sia usare onstart/onstop. Ecco un buon SO post che spiega il motivo per cui:

https://stackoverflow.com/a/19737191/2361947

+0

Grazie! Ho aggiunto e aggiornato su di esso nella domanda. La risposta non è ancora ovvia Penso, se ci sarà una risposta definitiva, aggiornerò di nuovo. Mi sembra che usare i bus dei messaggi risolva alcuni dei nostri problemi e possa generarne altri. – levavare

+0

Yup onStart/onStop è migliore in quanto può ricevere messaggi quando il telefono è bloccato. O dire che un messaggio GCM ricevuto può essere passato all'attività tramite Otto – Pranaysharma

0

Modulo EventBus Documentation che ho trovato ed è funziona bene per me:

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

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

E se è necessario inviare il riferimento EventBus al bambino poi:

private EventBus eventBus = EventBus.getDefault(); 
@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ....... 
} 

@Override 
public void onStart() { 
    super.onStart(); 
    if(!eventBus.isRegistered(this)){ 
     eventBus.register(this); 
    }else{ 
     Log.e(TAG, "EventBus is registered"); 
    } 
} 

@Override 
public void onStop() { 
    super.onStop(); 
    if(eventBus.isRegistered(this)){ 
     eventBus.unregister(this); 
    }else{ 
     Log.e(TAG, "EventBus is not registered"); 
    } 
}