web-dev-qa-db-fra.com

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

Je travaille sur une application Android assez complexe qui nécessite une assez grande quantité de données sur l'application (je dirais un total d'environ 500 Ko - cette taille est-elle importante pour un appareil mobile?). D'après ce que je peux dire, tout changement d'orientation dans l'application (dans l'activité, pour être plus précis) provoque une destruction et une reconstitution complète de l'activité. D'après mes conclusions, la classe d'applications n'a pas le même cycle de vie (c'est-à-dire qu'elle est, à toutes fins utiles, toujours instanciée). Est-il judicieux de stocker les informations d'état à l'intérieur de la classe d'application, puis de les référencer à partir de l'activité, ou s'agit-il généralement pas de la méthode "acceptable" en raison de contraintes de mémoire sur les périphériques mobiles? J'apprécie vraiment tout conseil sur ce sujet. Merci!

106
Dave

Je ne pense pas que 500kb soit un gros problème.

Ce que vous avez décrit est exactement la façon dont j'ai abordé mon problème de perte de données dans une activité. J'ai créé un singleton global dans la classe Application et j'ai pu y accéder à partir des activités que j'ai utilisées.

Vous pouvez transmettre des données dans un Global Singleton si elles doivent être beaucoup utilisées.

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

Puis appelez-le dans n'importe quelle activité en:

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

J'en discute ici dans mon billet de blog , sous la section "Global Singleton".

131
Bryan Denny

Ceux qui comptent sur Application instance ont tort. Au début, il peut sembler que la Application existe aussi longtemps que le processus d'application complet existe, mais il s'agit d'une hypothèse incorrecte. 

Le système d'exploitation peut tuer des processus si nécessaire. Tous les processus sont divisés en 5 niveaux de "possibilité de tuer" spécifié dans le doc .

Ainsi, par exemple, si votre application passe en arrière-plan en raison de la réponse de l'utilisateur à un appel entrant, alors, en fonction de l'état de la mémoire RAM, le système d'exploitation peut tuer (ou non) votre processus (en détruisant l'instance Application dans le processus). ).

Je pense qu'une meilleure approche consisterait à conserver vos données dans un fichier de stockage interne , puis à les lire lorsque votre activité reprendra.

METTRE À JOUR:

J'ai eu beaucoup de retours négatifs, il est donc temps d'ajouter une clarification. :) Eh bien, au départ, j'ai vraiment utilisé une hypothèse erronée selon laquelle l'état est vraiment important pour l'application. Toutefois, si votre application accepte que l'état soit parfois perdu (certaines images pourraient simplement être relues/téléchargées à nouveau), il est tout à fait correct de la conserver en tant que membre de Application.

56
Vit Khudenko

Si vous souhaitez accéder au "Singleton global" en dehors d'une activité et que vous ne voulez pas transmettre le Context à tous les objets impliqués pour obtenir le singleton, vous pouvez simplement définir un attribut statique dans votre classe d'application, qui contient la référence à lui-même. Il suffit d'initialiser l'attribut dans la méthode onCreate().

Par exemple:

public class ApplicationController extends Application {
    private static ApplicationController _appCtrl;

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

Etant donné que les sous-classes de Application peuvent également obtenir les ressources, vous pouvez y accéder simplement lorsque vous définissez une méthode statique qui les renvoie, comme suit:

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

Mais soyez très prudent lorsque vous passez les références de contexte à évitez les fuites de mémoire .

6
saxos

Dave, de quel genre de données s'agit-il? S'il s'agit de données générales relatives à l'application dans son ensemble (exemple: données utilisateur), développez la classe Application et stockez-la dans celle-ci. Si les données se rapportent à l'activité, vous devez utiliser les gestionnaires onSaveInstanceState et onRestoreInstanceState pour conserver les données en rotation d'écran.

2
Andrew

Vous pouvez en réalité remplacer la fonctionnalité d'orientation pour vous assurer que votre activité n'est ni détruite ni recréée. Regardez ici .

1
Grantland Chew

Vous pouvez créer une classe d’application et enregistrer toutes vos données sur des appels pour nous plus que partout dans votre application.

0
Ashish Jaiswal