113 votes

Utilisation de la classe d'applications Android pour conserver des données

Je suis en train de travailler sur une assez complexe de l'application Android, qui nécessite une assez grande quantité de données à propos de l'application (je dirais un total d'environ 500 KO -- est-ce pour un appareil mobile?). À partir de ce que je peux dire, tout changement d'orientation dans l'application (dans l'activité, pour être plus précis) provoque une destruction complète des loisirs et de l'activité. Selon mes constatations, la classe d'Application n'ont pas le même cycle de vie (c'est à dire qu'il est, à toutes fins et intentions, toujours instancié). Est-il judicieux de stocker les informations d'état de l'intérieur de la classe d'application et ensuite de référence à partir de l'Activité, ou est-ce généralement pas le "acceptable" de la méthode en raison des contraintes de mémoire sur les appareils mobiles? J'apprécie vraiment tous les conseils sur ce sujet. Merci!

133voto

Bryan Denny Points 12910

Je ne pense pas que 500kb sera que les grandes d'un accord.

Ce que vous décrivez est exactement comment je me suis attaquée à mon problème de perte de données dans une activité. J'ai créé un mondial singleton dans la classe d'Application et a été en mesure d'y accéder à partir des activités que j'ai utilisé.

Vous pouvez transmettre les données autour d'un Mondial Singleton si il va être beaucoup utilisé.

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

Puis l'appeler dans toute activité par:

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

J'en parle ici, dans mon blog, dans la section "Global Singleton."

59voto

Arhimed Points 18116

Ceux qui comptent sur le Application de l'instance sont mauvais. Au premier abord, il peut sembler que l' Application existe aussi longtemps que l'ensemble de l'application du processus existe, mais c'est une hypothèse erronée.

L'OS peut tuer les processus nécessaires. Tous les processus sont divisés en 5 niveaux de "killability" spécifié dans la doc.

Ainsi, par exemple, si votre application passe en arrière-plan en raison de l'utilisateur de répondre à un appel entrant, puis en fonction de l'état de la RAM, l'OS peut (ou non) d'arrêter votre processus (destruction de la Application instance dans le processus).

Je pense que la meilleure approche serait de persister vos données de la mémoire de stockage interne de fichier et le lire lors de votre reprise de l'activité.

Mise à JOUR:

J'ai eu beaucoup de commentaires négatifs, alors il est temps d'ajouter une précision. :) Eh bien, au départ, j'ai vraiment utilisé une hypothèse erronée que l'état qui est vraiment important pour l'application. Toutefois, si votre application est OK que, parfois, l'état est perdu (ça peut être quelques images qui seront il vous suffit de relire/retéléchargé), alors il est parfaitement OK pour le garder en tant que membre de l' Application.

6voto

saxos Points 1494

Si vous souhaitez accéder à la "Global Singleton" en dehors d'une activité et vous ne voulez pas passer l' Context par le biais de tous les objets pour obtenir le singleton, il vous suffit de définir un attribut static dans votre classe d'application, qui contient la référence à lui-même. Initialiser l'attribut dans l' onCreate() méthode.

Par exemple:

public class ApplicationController extends Application {
    private static ApplicationController _appCtrl;

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

Parce que les sous-classes d' Application peut également obtenir les Ressources, vous pourriez avoir accès simplement lorsque vous définissez une méthode statique qui renvoie, comme:

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

Mais soyez très prudent lors du passage autour de références de Contexte pour éviter les fuites de mémoire.

2voto

Andrew Points 4526

Dave, quel genre de données est-il ? Si c’est des données générales qui se rapporte à l’application dans son ensemble (exemple : données de l’utilisateur), puis étendre la classe Application et placez-le là. Si les données se rapporte à l’activité, vous devez utiliser les gestionnaires d’onSaveInstanceState et onRestoreInstanceState pour rendre persistantes les données sur la rotation de l’écran.

1voto

Grantland Chew Points 1377

Vous pouvez effectivement remplacer la fonctionnalité de l’orientation pour vous assurer que votre activité n’est pas détruite et recréée. Regardez ici.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X