2011-02-28 6 views
1

Je suis en train de créer une application qui récupère XML à partir d'un serveur, puis l'analyse (c'est formaté DIDL à certains endroits). L'objectif est de charger autant de mémoire que possible afin de faciliter la navigation des utilisateurs (afin de permettre un défilement rapide des résultats), mais je continue d'obtenir s. Je suis un peu nouveau sur Android, et il semble que les machines virtuelles sont très pointilleuses sur les choses. Je ne charge pas plus d'un mégaoctet de XML, et je m'en débarrasse à peu près tout de suite. Que dois-je faire pour empêcher ces erreurs de se produire? Dois-je charger un morceau par morceau du fichier sur le réseau, l'écrire sur le disque, puis charger le morceau par morceau dans la mémoire et le sortir de la mémoire, en analysant tout dans les POJO? Si cela peut être évité, je voudrais ne pas avoir à implémenter une forme de pagination, comme dans l'application Twitter (elle chargeait plus d'entrées quand vous atteigniez le fond, elle charge maintenant beaucoup tout en même temps et se bloque également avec une erreur OOM.) Je cours un Nexus One si cela aide, CM7/Android 2.3.3.Android OutOfMemoryError avec XML

Répondre

2

Vous pouvez lire ce joli article sur l'analyse XML sur Android. L'utilisation de l'analyseur par extraction serait un bon choix pour vous, car il n'a pas besoin de lire le document complet dans la mémoire, ce qui est le problème dans votre cas. Je suggère que vous stockez les résultats analysés dans la base de données, puisqu'une fois qu'ils sont là, vous pouvez rapidement les lister et les page comme vous le souhaitez, et la performance de la DB est grande. De cette façon, vous devez charger une seule fois les données complètes du serveur vers la base de données (si les données ne sont pas modifiées sur le serveur) ou les charger une fois, puis les mettre à jour de temps en temps (par exemple gazouillement).

+0

Cela a du sens. Je suppose que je vais regarder dans cela. J'utilise actuellement une API qui gère tous ces éléments (analyse, chargement en mémoire, etc.), donc je vais devoir tout casser et comprendre comment lancer ma propre requête HTTP pour cela et analyser mon propres résultats, mais oui, c'est un bon début. Il va également certainement augmenter les performances de l'application pour analyser les éléments élément par élément et les ajouter à la liste. –

1

Déplacez toutes vos déclarations d'objets hors des boucles et annulez-les après l'utilisation. Et utilisez System.gc() fréquemment (croyez-moi, ça marche). Utilisez des objets de niveau classe aussi bas que possible. Exécutez votre application et surveillez les journaux Logcat.