2013-07-30 15 views
9

Ho un'attività principale e un servizio associato. Il servizio associato riceve un comando dalla rete, che attiva un messaggio da inviare a un gestore nell'attività principale. Ho ottenuto tutto per funzionare passando il riferimento del gestore al servizio. E poi ... mi sono imbattuto in questa cosa chiamata Messenger.Perché utilizzare un Messenger anziché passare il riferimento a un gestore?

Messenger: riferimento a un gestore, che altri possono utilizzare per inviare messaggi ad esso. Ciò consente l'implementazione di comunicazioni basate sui messaggi attraverso i processi, creando un Messenger che punta a un gestore in un unico processo e consegnando quel Messenger a un altro processo.

Questo ha ispirato alcune domande:

  • funziona il processo termine significhiamo che non è necessario utilizzare un messaggero a meno che io generare un processo separato in base alle direttive Process and Thread ?
  • È sempre buona norma usare un Messenger?
  • Il passaggio di un riferimento al gestore è in genere una cattiva idea?
+0

Questa non è una risposta per la tua domanda, ma ti suggerisco di utilizzare AsyncTask per i thread in background. (vedere http://developer.android.com/reference/android/os/AsyncTask.html) –

+1

Utilizzo un IntentService associato, che dovrebbe gestire le richieste asincrone. Non credo che un AsyncTask sia appropriato, perché la documentazione afferma che "gli AsyncTask dovrebbero essere idealmente usati per operazioni brevi (pochi secondi al massimo.)" _, Mentre il mio servizio sta ascoltando i comandi da Internet e potrebbe essere eseguito per l'intera vita dell'attività. – Rich

+1

Anche come commento laterale, AsyncTasks deve essere richiamato dal thread dell'interfaccia utente – Selecsosi

risposta

7

Ha il processo a lungo termine vuol dire che non sarà necessario utilizzare un messaggero a meno che io generare un processo separato in base alle direttive di processo e della discussione?

Questo è corretto. È necessario un Messenger se si desidera associare un servizio remoto (ad esempio, in esecuzione in un altro processo). In questo caso, l'unica opzione per fornire il servizio remoto con un puntatore al tuo Handler sarebbe utilizzare un Messenger.

È sempre buona norma utilizzare un Messenger?

Non direi così. Usalo quando è veramente necessario - per i servizi remoti o se avvii il servizio senza vincolarlo. È possibile imballare Messenger come un extra in un Intent e avviare il servizio con esso. In questo modo è possibile passare un riferimento a Handler senza vincolare un servizio. Questo è un altro caso in cui è utile Messenger.

Il passaggio di un riferimento al gestore è in genere una cattiva idea?

Se gestisci correttamente la registrazione e l'annullamento della registrazione di Handler quando l'attività si avvia e si arresta, allora dovresti essere ok. Non è necessario quindi utilizzare Messenger per il servizio locale. Se non si annulla la registrazione del gestore correttamente, si verificheranno perdite di memoria (il servizio fa riferimento a un gestore e il gestore fa riferimento a un'attività interrotta).

Nonostante ciò, preferisco utilizzare Otto event bus per i servizi locali.

0

Il principale vantaggio di Messenger over handler è che Messenger è in grado di accodare tutti i messaggi inviati da vari client. Mentre Handler ha bisogno di un looper per farlo.Quindi messenger fornisce un vantaggio in più quando utilizzato in IPC tra processi remoti