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!
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".
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
.
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 .
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.
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 .
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.