2013-09-25 6 views
10

Sto cercando una risposta tecnica a come la libreria Android Robospice gestisce il ciclo di vita delle attività. Dalla ottenendo pagina di iniziare:.In che modo Robospice gestisce il ciclo di vita delle attività?

https://github.com/octo-online/robospice/wiki/Starter-Guide

"Come una classe interna della vostra attività (o altro contesto), aggiungere un RequestlListener che aggiornerà l'interfaccia utente Non preoccuparti per le perdite di memoria, RoboSpice gestisce l'attività di ciclo vitale."

La mia domanda è: in che modo Robospice aggiorna automaticamente i listener della richiesta in modo che sia ancora in grado di chiamare il listener corretto con il contesto corretto dopo una rotazione e dopo che l'attività è stata distrutta e ricreata come una nuova istanza?

Ho cercato per il reverse engineering del codice sorgente, ma non hanno ancora trovato una risposta:

https://github.com/octo-online/robospice

risposta

9

@Take Chance Make Cha. Quello che stai dicendo è completamente giusto. RS è stato progettato tenendo presente questa necessità espressa: gestione delle richieste di rete e dei cicli di vita delle attività.

@ craigrs84. Fondamentalmente, ciò che accade con RS è che quando una richiesta viene elaborata, i suoi ascoltatori saranno invocati finché l'attività associata è attiva. Se l'attività non è più attiva, tutti i suoi ascoltatori sono scollegati dalla RS e non saranno avvisati.

Lo scopo principale di RS è quello di assicurarsi che non ci siano perdite di memoria: la vostra attività, se deve morire, morirà e sarà spazzata via, RS non detiene alcun riferimento ad esso che possa impedire la spazzatura collezione. Questa è davvero l'idea alla base di RoboSpice.

Se si desidera ricollegare una nuova istanza dell'attività a una richiesta in sospeso (ad esempio, si esegue una richiesta, quindi ruotare il dispositivo e ottenere una nuova istanza dell'attività e si desidera che la nuova istanza riceva la richiesta risultato della richiesta eseguita dall'istanza precedente), che è possibile con RS.

In tal caso, utilizzare il metodo spiceManager.addListenerIfPending all'avvio, subito dopo la chiamata a spiceManager.start (..). Ciò non eseguirà una nuova richiesta, ma reinserirà un nuovo listener in una richiesta in sospeso. Se nessuna richiesta è in sospeso, allora non farà nulla.

+0

Quindi, se non si fornisce un requestCacheKey e si hanno più istanze della stessa attività in esecuzione nello stesso momento, addListenerIfPending funzionerà ancora correttamente? O non ci sono abbastanza informazioni in quel caso? Questo è probabilmente uno scenario improbabile, ma sono curioso. – craigrs84

+0

@snicolas, sono curioso, se non chiami shouldStop() (o il metodo non asincrono) la libreria non richiama gli ascoltatori registrati su Attività, Frammenti, Servizi, ecc.? Senza scavare troppo attraverso la fonte e basandomi sul mio utilizzo e test precoce della tua libreria, ricevevo un'eccezione quando ricevevo una richiamata a un oggetto che era "morto". Inoltre, la biblioteca è fantastica, per favore continuate così! – AllDayAmazing

+0

Se non si chiama shouldStop, gli ascoltatori verranno attivati. Ciò può causare arresti anomali e perdite di memoria poiché spesso gli ascoltatori sono classi interne e contengono un riferimento su un'istanza dell'attività che sarebbe stata distrutta e può persino bloccarsi se si eseguono cose come findViewById negli ascoltatori. Penso che tu l'abbia capito, volevo solo chiarire le cose. – Snicolas

2

La risposta breve, dalla mia esperienza, è che non è così.

Ad esempio, se non si chiama SpiceManager.shouldStop() ed è in esecuzione una richiesta, il riferimento a RequestListener viene comunque mantenuto e si può finire con una perdita di memoria mentre tenta di aggiornare qualsiasi riferimento a esso contenuto se la propria attività/Frammento/Servizio non esiste più.

+0

Spiacente, ma no, non c'è perdita di memoria in RS con gli ascoltatori. Vengono rimossi e i rifiuti vengono raccolti direttamente in shouldStop. – Snicolas