Domanda

Sto lavorando su un piuttosto complesso un'applicazione Android che richiede un po 'grande quantità di dati circa l'applicazione (direi un totale di circa 500 KB - è questo grande per un dispositivo mobile?). Da quello che posso dire, qualsiasi modifica orientamento nell'applicazione (in attività, per essere più precisi) causa una distruzione completa e la ricreazione delle attività. Sulla base dei miei risultati, classe Application non ha lo stesso ciclo di vita (vale a dire che è, a tutti gli effetti, sempre istanziato). Ha senso per memorizzare le informazioni di stato all'interno della classe di applicazione e quindi fare riferimento dalla libero, o è che generalmente non il metodo "accettabili" a causa dei limiti di memoria su dispositivi mobili? I really appreciate qualche consiglio su questo argomento. Grazie!

È stato utile?

Soluzione

Non credo 500kb sarà quello grande di un affare.

Quello che hai descritto è esattamente come ho affrontato il mio problema di perdita di dati in un'attività. Ho creato un singleton globale nella classe Application ed è stato in grado di accedervi dalle attività che ho usato.

È possibile passare i dati in giro in un Singleton globale se sta per essere usato un sacco.

public class YourApplication extends Application 
{     
     public SomeDataClass data = new SomeDataClass();
}

Poi chiamare in qualsiasi attività da:

YourApplication appState = ((YourApplication)this.getApplication());
appState.data.UseAGetterOrSetterHere(); // Do whatever you need to with the data here.

discuto che qui nel mio post sul blog , nella sezione "Global Singleton".

Altri suggerimenti

Quelli che contano su istanza Application sono sbagliate. In un primo momento, può sembrare come se esiste la Application finché esiste l'intero processo di applicazione, ma questo è un presupposto errato.

Il sistema operativo può uccidere i processi, se necessario. Tutti i processi sono divisi in 5 livelli di "killability" specificato nel doc .

Così, per esempio, se la vostra applicazione va in background grazie per l'utente di risposta ad una chiamata in arrivo, quindi a seconda dello stato della RAM, il sistema operativo può (o non può) uccidere il vostro processo (distruggendo l'istanza Application nel processo).

Credo che un approccio migliore sarebbe quello di persistere i dati al file di archiviazione interna e poi leggerlo quando l'attività riprende.

UPDATE:

ho ricevuto molti feedback negativi, quindi è il momento di aggiungere una precisazione. :) Beh, inizialmente ho davvero usato un presupposto sbagliato che lo Stato è molto importante per l'applicazione. Tuttavia, se la vostra applicazione è OK che a volte lo Stato si perde (potrebbe essere alcune immagini che saranno appena riletto / redownloaded), allora è pienamente OK per tenerlo come un membro della Application.

Se si desidera accedere all'esterno "Global Singleton" di un'attività e non si vuole passare il Context attraverso tutti gli oggetti coinvolti per ottenere il singleton, si può semplicemente definire un attributo statico nella classe di applicazione, che detiene il riferimento a se stessa. Basta inizializzare l'attributo nel metodo onCreate().

Ad esempio:

public class ApplicationController extends Application {
    private static ApplicationController _appCtrl;

    public static ApplicationController getAppCtrl()
    {
         return _appCtrl;
    }
}

A causa sottoclassi di Application è inoltre possibile ottenere le risorse, si potrebbe accedervi semplicemente quando si definisce un metodo statico, che li restituisce, come:

public static Resources getAppResources()
{
    return _appCtrl.getResources();
}

Ma essere molto attenti quando si passa intorno riferimenti al contesto .

Dave, che tipo di dati si tratta? Se si tratta di dati generali che riguarda l'applicazione nel suo complesso (ad esempio: i dati utente), quindi estendere la classe di applicazione e lo immagazzinano là. Se si riferisce la data all'attività, è necessario utilizzare l'onSaveInstanceState e gestori onRestoreInstanceState a persistere i dati sulla rotazione dello schermo.

Si può effettivamente ignorare la funzionalità di orientamento per assicurarsi che la vostra attività non è distrutto e ricreato. Guardate qui .

È possibile creare Classe di applicazione e salvare i tutti i dati presenti che le chiamate per noi che in qualsiasi nell'applicazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top