Question

Je travaille sur une application Android assez complexe qui nécessite une quantité assez importante 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 des loisirs de l'activité. Sur la base de mes résultats, la classe d'application n'a pas le même cycle de vie (à savoir qu'il est, à toutes fins utiles, toujours instancié). Est-il judicieux de stocker les informations d'état à l'intérieur de la classe d'application, puis référencer de l'activité, ou 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 des conseils sur ce sujet. Merci!

Était-ce utile?

La solution

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

Qu'est-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 d'application et a pu y accéder à partir des activités que j'ai utilisé.

Vous pouvez transmettre des données autour d'un Singleton mondial si elle va être beaucoup utilisé.

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

Ensuite, appelez dans toute activité par:

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

Je discuterai ici dans mon blog , sous la rubrique "global Singleton".

Autres conseils

Ceux qui comptent sur l'instance Application ont tort. Tout d'abord, il peut sembler que le Application existe aussi longtemps que l'ensemble du processus d'application existe, mais cela est une hypothèse erronée.

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é dans le doc .

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

Je pense qu'une meilleure approche serait de persistent vos données au fichier de stockage interne puis le lire lorsque votre activité reprend.

Mise à jour:

Je beaucoup eu des rétroactions négatives, il est temps d'ajouter une précision. :) Eh bien, je realy d'abord une hypothèse erronée que l'État est vraiment important pour l'application. Toutefois, si votre application est OK que, parfois, l'état est perdu (il pourrait être quelques images qui seront relus juste / redownloaded), il est tout à fait OK pour le garder en tant que membre de Application.

Si vous souhaitez accéder à l'extérieur d'une activité « Global Singleton » et vous ne voulez pas passer le Context à travers tous les objets impliqués pour obtenir le singleton, vous pouvez juste définir un attribut statique dans votre classe d'application, qui détient 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;
    }
}

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, ce qui les renvoie, comme:

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

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

Dave, quel type de données est-il? Si ses données générales qui se rapporte à l'application dans son ensemble (par exemple: les données utilisateur), puis étendre la classe d'application et y stocker. Si les données se rapporte à l'activité, vous devez utiliser les gestionnaires onSaveInstanceState et onRestoreInstanceState pour conserver les données sur la rotation de l'écran.

Vous pouvez réellement passer outre la fonctionnalité d'orientation pour vous assurer que votre activité ne soit pas détruite et recréée. Regardez .

Vous pouvez créer la classe d'applications et d'enregistrer vos toutes les données qui nous demande que partout dans votre application.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top