2009-08-06 8 views
1

Je dois conserver un objet complexe dans mon service pour pouvoir y revenir de manière fiable (il contient des mises à jour). Initialement, je l'ai codé comme une classe déposée dans mon implémentation de Service mais j'observe que l'objet updates est périodiquement réinitialisé à null ce qui me dit que la classe de serveur elle-même est recréée. Quelqu'un peut-il recommander une stratégie légère et fiable pour sauvegarder et recréer de telles mises à jour objet (je peux le rendre sérialisable)Champ persistant dans le service Android

Répondre

4

Lorsque votre service est redémarré, les méthodes onStop() et onStart() sont appelés. Vous pouvez utiliser la méthode onStop() pour enregistrer vos données dans un emplacement persistant, par ex. une base de données d'application sqlite. Vous pouvez restaurer les données lorsque onStart() est appelée.

Vous pouvez lire à propos de l'utilisation d'une base de données sqlite sur le développeur android website.

+0

Je pense que le problème n'est pas avec onStop et onStart mais avec le fait que pour servir ces méthodes Android peut créer une nouvelle instance de la classe. Je ne veux vraiment pas aller sqlite db route puisque ce serait une autre dépense dans le traitement déjà cher. J'étudie la sérialisation/désérialisation pour une alternative plus légère – Bostone

+1

Après l'appel de onStop(), votre instance de service sera détruite. C'est pourquoi la méthode est appelée: d'une manière ou d'une autre, vous devez sauvegarder vos données ici. Si vous ne souhaitez pas utiliser de base de données, vous pouvez enregistrer un fichier à l'aide de Context.openFileOutput(). Vous pouvez le lire plus tard (par exemple quand onStart() est appelé) en utilisant Context.openFileInput() – Scharrels

+0

Donc suivant cette route: si j'ai une chaîne déposée dans ma classe Service, il semble plus efficace de lire/écrire sur onStart/OnStop et l'utiliser autrement comme un champ de classe plutôt que de le lire/écrire à SharedProperties chaque fois que la variable est nécessaire – Bostone

3

Si je le faisais, j'utiliserais SharedPreferences. Si c'est trop complexe pour cela, je suis d'accord avec @Scharrels sur l'utilisation d'une base de données sqlite (qui serait probablement la recommandation de Google puisque leurs exemples utilisent sqlite dans les plus petits cas, ce qui implique un niveau de performance raisonnable).

J'ai trouvé SharedPreferences utile dans un certain nombre de cas. Tout d'abord, étant un magasin d'appariement clé-valeur, une variété de données différentes peuvent facilement être stockées, plus vous pouvez encoder vos objets dans une chaîne, si nécessaire, et les stocker dans un seul champ. Deuxièmement, vous pouvez utiliser plusieurs magasins SharedPreference en les récupérant simplement sous un nom différent (tout en les gardant privés). Enfin, je les trouve faciles à utiliser car obtenir des données et stocker des données n'est littéralement que quelques lignes de code (sans compter les données de munging ou de sérialisation dont vous pourriez avoir besoin).

+2

Gardez à l'esprit que les SharedPreferences sont stockées dans un fichier XML et, par conséquent, ne sont pas garanties transactionnelles. – CommonsWare

+1

Bien sûr. Et, selon la complexité réelle des objets qui doivent être conservés, peut être moins efficace qu'un petit sqlite db. Cependant, le codage serait très rapide pour mettre en place quelque chose de persistant, par rapport à la solution existante de rien. Du côté positif, la persistance dans onDestroy() se terminera, car elle est autorisée à se terminer avant que le processus puisse être tué. – lilbyrdie

+0

Marque. Pour être complètement conforme à ce que j'essaie de persister est l'instance de HtmlClient et éventuellement certains objets dérivés. Ils sont assez complexes et peuvent ne pas être sérialisables. Pourquoi? Par exemple, HttpClient est initialisé avec un certain nombre de cookies que je dois conserver pour effectuer avec succès une session créée pour moi sur un serveur d'applications. Que fais-je? – Bostone