Quindi una delle sfide su Android sono le varie specifiche del dispositivo (in particolare la memoria del dispositivo).Determinazione della memoria disponibile su Android
Ho scritto i miei oggetti modello per utilizzare in modo estensivo Java SoftReferences
in modo lazy load, quindi la VM è libera di tagliare parti del modello di dati attualmente non utilizzate come ritengono opportuno e vengono semplicemente ricostituite secondo necessità.
Tuttavia, una sfida nella pratica con SoftReferences
è che tendono a essere cancellati in pochi secondi di riferimento debolmente in contrapposizione alla sospensione finché la VM non ha memoria ridotta, quindi funzionano bene in termini di consentire il modello per tagliare, ma non funzionano bene in quanto spesso significa che nulla è in memoria. Idealmente su un dispositivo con un sacco di memoria, si consentirebbe all'utente di mantenere gli oggetti in memoria.
Come risultato, è comune combinare SoftReferences
con un meccanismo LRU, in cui l'LRU mantiene un puntatore rigido agli oggetti di riferimento recenti. Questo ovviamente non è l'ideale dato che presuppone di avere abbastanza memoria per tutti questi oggetti appena citati.
Inoltre, è una sfida sapere quale è un buon valore predefinito per LRU.
In un mondo perfetto, Android potrebbe usare è a basso richiamata la memoria come un suggerimento (così mi potrebbe iniziare con un piccolo LRU, e periodicamente aumentarlo fino callback di memoria insufficiente iniziato che si verificano poi di nuovo fuori per trovare un buon valore per un dispositivo), ma nella mia esperienza questa richiamata non sembra mai coincidere con la pressione effettiva della memoria VM.
Qualcuno si è imbattuto in un modo ragionevole per rilevare che il modello di dati utilizza troppa memoria su un particolare dispositivo?
Il conteggio 'OutOfMemoryException' conta? https://developer.android.com/training/displaying-bitmaps/cache-bitmap.html il 'memClass' usato potrebbe essere un modo per (staticamente) ridimensionare il tuo modello. – zapl
Penso che quando OutOfMemoryErrors inizia a essere lanciato tu sei fondamentalmente un hosed. Ma grazie per il link all'articolo. –