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 - est-ce grand 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 complète et une recréation de l'activité. D'après mes conclusions, la classe Application 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 n'est-ce généralement pas la méthode «acceptable» en raison des contraintes de mémoire sur les appareils mobiles? J'apprécie vraiment tout conseil sur ce sujet. Merci!
112
Réponses:
Je ne pense pas que 500kb sera un si gros problème.
Ce que vous avez décrit est exactement comment 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.
Puis appelez-le dans n'importe quelle activité en:
J'en discute ici dans mon article de blog , sous la section «Global Singleton».
la source
Ceux qui comptent sur l'
Application
exemple se trompent. Au début, il peut sembler que leApplication
existe aussi longtemps que l'ensemble du processus d'application 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 "killability" spécifiés dans la doc .
Ainsi, par exemple, si votre application passe en arrière-plan parce que l'utilisateur répond à un appel entrant, alors en fonction de l'état de la RAM, le système d'exploitation peut (ou non) tuer votre processus (détruisant l'
Application
instance dans le processus) .Je pense qu'une meilleure approche serait de conserver vos données dans un fichier de stockage interne , puis de le lire lorsque votre activité reprend.
METTRE À JOUR:
J'ai reçu de nombreux retours négatifs, il est donc temps d'ajouter une clarification. :) Eh bien, au départ, j'ai vraiment utilisé une fausse hypothèse selon laquelle l'état est vraiment important pour l'application. Cependant, si votre application est OK et que parfois l'état est perdu (il peut s'agir de certaines images qui seront simplement relues / téléchargées à nouveau), alors il est tout à fait OK de la conserver en tant que membre de
Application
.la source
Application
instance, mais il n'y aura pas de données statiques sur lesquelles vous comptez à moins que vous ne les ayez persistées.Si vous souhaitez accéder au "Global Singleton" en dehors d'une activité et que vous ne souhaitez pas passer
Context
par 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. Initialisez simplement l'attribut dans laonCreate()
méthode.Par exemple:
Parce 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:Mais soyez très prudent lorsque vous passez des références de contexte pour éviter les fuites de mémoire .
la source
Application
pour ce faire. Vous pouvez déclarer une variable membre statique dans n'importe quelle classe pour ce faire.Dave, de quel genre de données s'agit-il? Si ce sont des données générales qui concernent l'application dans son ensemble (exemple: données utilisateur), étendez la classe Application et stockez-la là. Si les données concernent l'activité, vous devez utiliser les gestionnaires onSaveInstanceState et onRestoreInstanceState pour conserver les données lors de la rotation de l'écran.
la source
Vous pouvez en fait remplacer la fonctionnalité d'orientation pour vous assurer que votre activité n'est pas détruite et recréée. Regardez ici .
la source
Vous pouvez créer une classe Application et enregistrer toutes vos données sur ces cals pour les utiliser n'importe où dans votre application.
la source
Je sais que c'est la très vieille question, mais l'utilisation du ViewModel des composants jetpack est le meilleur moyen de préserver les données entre la rotation d'activité.
la source