2013-03-24 15 views
5

Domanda di progettazione in sostanza - con uno PreferenceActivity si dovrebbe implementarlo OnSharedPreferenceChangeListener o si dovrebbe definire questa funzionalità in un'altra classe, ad esempio in una classe interna? C'è qualche ragione per preferire quella sull'altro approccio?Android: dove deve essere definito/registrato un OnSharedPreferenceChangeListener

Anche dove registrare l'ascoltatore? Voglio dire the docs e il buon senso impone di registrare/annullare la registrazione in onResume/onPause rispettivamente, ma aver visto azillionregistrations in onCreate Mi chiedo solo se mi manca qualcosa.

Anche io non sono abbastanza sicuro se un errore per annullare la registrazione (in modo here per esempio l'annullamento della registrazione non può essere chiamato come onStop non è garantito di essere chiamato) sarebbe necessariamente portare ad una perdita. Quindi, se ho per esempio

class MyPref extends PreferenceActivity implements 
      OnSharedPreferenceChangeListener { 
    SharedPreferences sharedPreferences; 
    // init sharedPreferences 
    onStart(){ 
     sharedPreferences.registerOnSharedPreferenceChangeListener(this); 
    } 
    // no unregistration 
} 

sarebbe questo fuoriuscire l'istanza MyPref volta che torno a uno dei miei altre attività?

Infine, le stesse considerazioni valgono per OnPreferenceChangeListener?

Modifica: tornando a quello che vedo alcun modo per annullare la registrazione del OnPreferenceChangeListener - sono cieco ??

risposta

1

Non credo ci siano motivi importanti per favorire un luogo particolare per l'ascoltatore, a parte le preferenze personali. Avere il Activity implementarlo, o usare una classe interna - anonima o meno - sono tutti OK.

L'unica cosa è che se non si sta utilizzando un oggetto esistente come il proprio Activity come listener, è necessario mantenere un riferimento all'oggetto listener. Come da this answer, otterrà la raccolta dei dati inutili (e quindi non ascolterà nulla) se non lo fai.


Dopo aver scavato nella fonte un po ', sembra SharedPreferencesImpl utilizza un WeakHashMap per contenere i listener registrati (source, linee 72-73, 186-196), il che significa che non riuscendo a annullare la registrazione non sarà causa da un perdita.

Come dici tu, i documenti consigliano di utilizzare onResume()/onPause(); questo probabilmente non ha nulla a che fare con le perdite, ma invece per evitare che le app in background facciano un'elaborazione non necessaria - vale ancora la pena di seguirla!

0

Fare la registrazione e annullare la registrazione in /onResume è un sacco di lavoro extra per niente.

si potrebbe fare un'implementazione anonima del vostro ascoltatore come parte della vostra classe come questa:

[class level] 
... 
OnSharedPreferenceChangeListener mListener = new OnSharedPreferenceChangeListener() { 
    onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
     // your code here 
    } 
}; 
... 
[class level] 

Poi lo si imposta laddove applicabile. Se lo fai, il tuo ascoltatore non verrà ricreato come oggetto diverso tra /onResume (a meno che l'app non venga uccisa e la sottoclasse Activity debba essere caricata di nuovo), quindi assegnarla non ha senso, dal momento che fa sempre riferimento allo stesso oggetto. D'altra parte, se la tua app viene uccisa, verrà chiamato di nuovo lo onCreate.

Per quanto riguarda l'implementazione di un classe interna, o no, io tendono a preferire avere un'implementazione anonima (come indicato sopra) a causa della maggiore pulizia del codice - io non devo perdere tempo con nomi di classe e devono digitare meno parentesi. Tuttavia, è davvero una cosa preferenziale, quindi fai tutto quello che senti è meglio.

+1

_Per registrazione e annullamento della registrazione_ - perché? non sarebbe necessario annullare la registrazione dell'ascoltatore? e la perdita che ho chiesto? –

+0

Non è necessario annullarne la registrazione. Il sistema lo ucciderà semplicemente se decide di uccidere l'app. Inoltre, ogni app viene eseguita nella propria istanza VM, che viene anch'essa uccisa, quindi non è necessario annullare la registrazione di qualcosa e non si verificherà alcuna perdita: tutta la memoria verrà rilasciata quando il processo muore (il kernel si occuperà di ciò) . Questo è il motivo per cui è consigliabile salvare i dati nella memoria persistente in 'onPause' o' onStop'. Tuttavia, ciò non avviene tra 'onPause' e' onResume'. – Shade

+0

@Mr_and_Mrs_D, hai trovato una risposta migliore a questa domanda? Se è così, perché non rispondi a beneficio di tutti? – Shade

Problemi correlati