IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Parser un gros fichier XML


Sujet :

Android

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 144
    Points : 118
    Points
    118
    Par défaut Parser un gros fichier XML
    Bonjour,

    J'ai besoin de récupérer un assez grand nombre d'informations depuis un serveur, et je parse donc un fichier XML.
    J'ai beaucoup d'entrées dans ce fichier XML, et je créé environ 3000 objets Client qui seront stockés dans une liste ArrayList<Client>.

    Pour information, j'utilise toutes les informations (toutes les balises, tous les attributs...) du fichier XML.
    Je n'ai donc pas spécialement besoin d'un système qui saute plein de balises/tags ou autre.

    Je connais donc plusieurs moyens pour parser un fichier XML : DOMDocument, XmlPullParser, et SAX.
    J'ai effectué plusieurs tests, et voici ce qui en sort dans mon cas :
    - SAX est le plus rapide, mais on voit plusieurs actions du Garbage Collector dans le logcat.
    - DOMDocument est le moins rapide, et on voit plusieurs actions du Garbage Collector (c'est sans doute le pire, et je m'en doutais).
    - XmlPullParser est au milieu en terme de rapidité, et c'est celui qui demande le moins d'action du Garbage Collector.

    Code Trace du logcat à l'exécution : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    01-28 09:01:02.923: E/SAX(2063): début SAX
    01-28 09:01:03.113: D/dalvikvm(2063): GC_CONCURRENT freed 92K, 3% free 6337K/6471K, paused 27ms+5ms, total 74ms
    01-28 09:01:04.273: D/dalvikvm(2063): GC_CONCURRENT freed 29K, 2% free 6735K/6855K, paused 29ms+35ms, total 126ms
    01-28 09:01:05.163: D/dalvikvm(2063): GC_CONCURRENT freed 12K, 2% free 7129K/7239K, paused 30ms+4ms, total 106ms
    01-28 09:01:06.043: D/dalvikvm(2063): GC_CONCURRENT freed 14K, 2% free 7515K/7623K, paused 29ms+55ms, total 138ms
    01-28 09:01:06.713: D/dalvikvm(2063): GC_CONCURRENT freed 16K, 2% free 7894K/8007K, paused 23ms+22ms, total 124ms
    01-28 09:01:06.873: E/SAX(2063): fin SAX
     
     
    01-28 09:01:29.313: E/DOM(2114): début DOM
    01-28 09:01:29.534: D/dalvikvm(2114): GC_CONCURRENT freed 96K, 4% free 6332K/6535K, paused 20ms+15ms, total 74ms
    01-28 09:01:31.894: D/dalvikvm(2114): GC_CONCURRENT freed 30K, 2% free 6726K/6855K, paused 22ms+28ms, total 176ms
    01-28 09:01:33.713: D/dalvikvm(2114): GC_CONCURRENT freed 15K, 2% free 7126K/7239K, paused 30ms+21ms, total 134ms
    01-28 09:01:35.523: D/dalvikvm(2114): GC_CONCURRENT freed 16K, 2% free 7507K/7623K, paused 19ms+22ms, total 98ms
    01-28 09:01:37.126: D/dalvikvm(2114): GC_CONCURRENT freed 79K, 2% free 7850K/8007K, paused 29ms+18ms, total 144ms
    01-28 09:01:37.723: E/DOM(2114): fin DOM
     
     
    01-28 09:01:57.684: E/XmlPullParser(2166): début XmlPullParser
    01-28 09:01:57.884: D/dalvikvm(2166): GC_CONCURRENT freed 97K, 4% free 6334K/6535K, paused 9ms+13ms, total 91ms
    01-28 09:02:01.714: D/dalvikvm(2166): GC_CONCURRENT freed 67K, 3% free 6686K/6855K, paused 31ms+9ms, total 112ms
    01-28 09:02:02.744: E/XmlPullParser(2166): fin XmlPullParser

    Code Aperçu du fichier XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?xml version="1.0" encoding="UTF-8"?>
    <clients>
    	<client machin="fesfse" truc="sfeg" />
    	<client machin="srg" truc="dfhjjtr" />
    	... 
    </client>

    Code Aperçu de l'asynctask : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
    public class XMLTask extends AsyncTask<Void, Void, ClientAdapter>
    {
     
    	private String url;
    	private Context context;
            private MonListener monListener;
     
    	public XMLTask(String url, Context context, MonListener monListener)
    	{
    		this.url = url;
    		this.context = context;
                    this.monListener = monListener;
    	}
     
     
    	@Override
        protected ClientAdapter doInBackground(Void... params)
        {
    		try
    		{
    			List<Client> clients;
     
     
    Log.e("ClientXmlParser", "début");
    				ClientXmlParser parser = new ClientXmlParser();
    				clients = parser.parse(Network.streamUrl(this.url));
    Log.e("ClientXmlParser", "fin");
     
     
     
     
    Log.e("DOM", "début");	
    				URL mUrl = new URL(this.url);
    				DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
    				Document doc = builder.parse(new InputSource(mUrl.openStream()));
     
    				Element racine = doc.getDocumentElement();
     
    				NodeList liste = racine.getElementsByTagName("client");
    				Element client;
     
     
    				// Parcours des clients
    				clients = new ArrayList<Client>();
    				int nbClient = liste.getLength();
     
    				for (int i = 0; i < nbClient; i++)
    				{
    					client = (Element) liste.item(i);
     
    					clients.add(new Client(client.getAttribute("truc"), client.getAttribute("machin"), ...));					
    				}
    Log.e("DOM", "fin");
     
     
     
    Log.e("SAX", "début");
    				URL url = new URL(this.url);
    				ClientHandler handler = new ClientHandler();
     
    				XMLReader xmlReader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();			    
    			    xmlReader.setContentHandler(handler);
     
    			    xmlReader.parse(new InputSource(url.openStream()));
    			    clients = handler.getClientsList();
    Log.e("SAX", "fin");
     
     
     
     
    				if (clients == null || clients.size() == 0) { return null; }
    				else { return new ClientAdapter(clients, this.context, R.layout.clientList); }
     
     
    	    }		
    		catch (Exception e) { return null; }
        }
     
     
    	@Override
    	protected void onPostExecute(ClientAdapter adapter)
    	{		
    		if (adapter != null)
    		{
    			this.monListener.onSuccess(adapter);
    		}
    		else
    		{
    			this.monListener.onError();
    		}
    	}
     
    }

    Code Aperçu de la classe ClientHandler (SAX) : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    public class ClientHandler extends DefaultHandler
    {
     
        private List<Client> clients_list;
     
    	public ClientHandler() 
        {
            this.clients_list = new ArrayList<Client>();
        }
     
     
    	@Override
        public void startElement(String nameSpaceURI, String localName, String qName, Attributes attributs) throws SAXException 
        {
        	if (localName.equals("client"))
        	{        
        		String machin = attributs.getValue("machin");
        		String truc = attributs.getValue("truc"); 
     
    			this.clients_list.add(new Client(machin, truc));
        	}
        }
     
     
    	public List<Client> getClientsList()
    	{
    		return this.clients_list;
    	}
     
    }

    Code Aperçu de la classe ClientXmlParser (XmlPullParser) : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
     
    public class ClientXmlParser
    {
     
    	private static final String namespace = null; // pas de namespace
     
     
    	public List<Client> parse(InputStream inputStream) throws XmlPullParserException, IOException
    	{
    		try
    		{
    			XmlPullParser parser = Xml.newPullParser();
     
    			parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
    			parser.setInput(inputStream, null);
    			parser.nextTag();
     
    			return readClients(parser);
    		}
    		finally
    		{
    			inputStream.close();
    		}
    	}
     
     
     
    	private List<Client> readClients(XmlPullParser parser) throws XmlPullParserException, IOException
    	{
    		List<Client> clients = new ArrayList<Client>();
     
    		parser.require(XmlPullParser.START_TAG, namespace, "clients");
     
    		while (parser.next() != XmlPullParser.END_TAG)
    		{
    			if (parser.getEventType() != XmlPullParser.START_TAG)
    			{
    				continue;
    			}
     
     
    			String name = parser.getName();
     
    			if (name.equals("client"))
    			{
    				clients.add(readClient(parser));
    			}
    			else
    			{
    				skip(parser);
    			}
    		}
     
    		return clients;
    	}
     
     
     
    	private Client readClient(XmlPullParser parser) throws IOException, XmlPullParserException
    	{
    		parser.require(XmlPullParser.START_TAG, namespace, "client");
     
    		String machin = parser.getAttributeValue(null, "machin");
    		String truc = parser.getAttributeValue(null, "truc");
    		...	
     
    		// TODO : nextTag + require OU next ?
     
    		//parser.nextTag();
    		//parser.require(XmlPullParser.END_TAG, namespace, "client");
    		parser.next();
     
    		return new Client(machin, truc, ...);
    	}
     
     
     
    	private void skip(XmlPullParser parser) throws XmlPullParserException, IOException
    	{
    		if (parser.getEventType() != XmlPullParser.START_TAG)
    		{
    			throw new IllegalStateException();
    		}
     
     
    		int depth = 1;
    		while (depth != 0)
    		{
    			switch (parser.next())
    			{
    				case XmlPullParser.END_TAG:
    					depth--;
    					break;
     
    				case XmlPullParser.START_TAG:
    					depth++;
    					break;
    			}
    		}
    	}
    }


    Question 1 : Est-ce mieux d'utiliser XML ou JSON ? Pourquoi ?

    Question 2 : Est-ce que mon code est correcte ?

    Question 3 : Par rapport à ce dont j'ai besoin, quelle est le meilleur parser XML selon vous ?

    Question 4 : Que signifie ces différentes actions du Garbage Collector ?

    Question 5 : Pourquoi la mémoire ne redescends pas ? (nombres en gras : GC_CONCURRENT freed 111K, 2% free, 14394K/14599K, paused 24ms+6ms total 173ms)
    Une fois que je quitte l'activité qui affiche la liste, les objets ne sont-ils pas censés être détruits/désalloués état donné que je ne m'en sert pas en dehors de cette activité ?
    Pire, si je lance plusieurs fois de suite l'activité de récupération/création de la liste, on voit bien que la mémoire augmente et on arrive même à un message "Clamp target GC heap...".
    D'ailleurs, j'ai testé avec 20.000 entrées et le système force l'application à se fermer (sauf avec XMLPullParser).

    Code Trace du logcat après plusieurs exécutions : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    01-28 08:58:05.751: D/dalvikvm(1993): GC_CONCURRENT freed 92K, 3% free 6341K/6535K, paused 29ms+9ms, total 89ms
    01-28 08:58:07.001: D/dalvikvm(1993): GC_CONCURRENT freed 26K, 2% free 6735K/6855K, paused 26ms+4ms, total 78ms
    01-28 08:58:07.770: D/dalvikvm(1993): GC_CONCURRENT freed 12K, 2% free 7134K/7239K, paused 29ms+4ms, total 98ms
    01-28 08:58:08.550: D/dalvikvm(1993): GC_CONCURRENT freed 13K, 2% free 7513K/7623K, paused 22ms+4ms, total 104ms
    01-28 08:58:09.250: D/dalvikvm(1993): GC_CONCURRENT freed 16K, 2% free 7898K/8007K, paused 37ms+57ms, total 154ms
    01-28 08:58:12.560: D/dalvikvm(1993): GC_CONCURRENT freed 50K, 2% free 8372K/8519K, paused 23ms+4ms, total 176ms
    01-28 08:58:13.860: D/dalvikvm(1993): GC_CONCURRENT freed 39K, 2% free 9024K/9159K, paused 22ms+21ms, total 127ms
    01-28 08:58:17.340: D/dalvikvm(1993): GC_CONCURRENT freed 61K, 2% free 9899K/10055K, paused 52ms+24ms, total 274ms
    01-28 08:58:19.590: D/dalvikvm(1993): GC_CONCURRENT freed 63K, 2% free 11052K/11207K, paused 27ms+0ms, total 136ms
    01-28 08:58:24.331: D/dalvikvm(1993): GC_CONCURRENT freed 81K, 2% free 12568K/12743K, paused 22ms+34ms, total 183ms
    01-28 08:58:29.841: I/dalvikvm-heap(1993): Clamp target GC heap from 16.094MB to 16.000MB
    01-28 08:58:29.841: D/dalvikvm(1993): GC_CONCURRENT freed 111K, 2% free 14394K/14599K, paused 24ms+6ms, total 173ms



    Merci d'avance pour votre aide.

  2. #2
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par gilloddon Voir le message
    J'ai beaucoup d'entrées dans ce fichier XML, et je créé environ 3000 objets Client qui seront stockés dans une liste ArrayList<Client>.
    Attention aux limites mémoires des applications (3000 entrées sur 24Mo, ca limite les entrées à 6Ko !)... Ne vaudrait il pas mieux de tout coller dans une table sqlite (sans stockage en mémoire).

    Question 1 : Est-ce mieux d'utiliser XML ou JSON ? Pourquoi ?
    Aucun des deux n'est "mieux" ou "moins bien"... Chacun a ses avantages: XML est très typé (DTDs...), JSON est light-weight... (la taille de transfert des fichiers par internet peut être divisée par 2 ou 3 !)
    Question 3 : Par rapport à ce dont j'ai besoin, quelle est le meilleur parser XML selon vous ?
    SAX est probablement le plus simple si on ne veut pas stocker localement.
    DOM a le gros probleme de stocker la hierarchie entierement en mémoire (format DOM)...

    Question 4 : Que signifie ces différentes actions du Garbage Collector ?
    GC_CONCURRENT: appel au garbage collector quand de la mémoire est allouée *avant* que la pile de nécessite d'être agrandie.
    GC_EXPLICIT: appel explicite à System.gc(); ne devrait jamais avoir lieu
    GC_FOR_MALLOC: appel au garbage collector pour fair un "malloc" (extension de pile), c'est celui qui est dangereux (stall de l'appli à prori)

    Le premier chiffre est le nombre d'octets libérés.
    % free est la taille de la heap libre pour java
    alloué / total : la taille de la heap
    paused X/Y, total Z: un temps X a été passé sans "interruption" des threads, Y avec interruption, pour un total de temps passé dans le thread du GC de Z.

    Question 5 : Pourquoi la mémoire ne redescends pas ? (nombres en gras : GC_CONCURRENT freed 111K, 2% free, 14394K/14599K, paused 24ms+6ms total 173ms)
    Une fois que je quitte l'activité qui affiche la liste, les objets ne sont-ils pas censés être détruits/désalloués état donné que je ne m'en sert pas en dehors de cette activité ?
    Pire, si je lance plusieurs fois de suite l'activité de récupération/création de la liste, on voit bien que la mémoire augmente et on arrive même à un message "Clamp target GC heap...".
    D'ailleurs, j'ai testé avec 20.000 entrées et le système force l'application à se fermer (sauf avec XMLPullParser).
    Si bien sur... cela doit redescendre... si cela ne redescend pas il y a un memory leak...
    Passer un coup de "MAT" pour voir ce qui prend de la place...
    http://android-developers.blogspot.f...r-android.html

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 144
    Points : 118
    Points
    118
    Par défaut
    Tout d'abord, merci pour ta réponse.


    Citation Envoyé par nicroman Voir le message
    Attention aux limites mémoires des applications (3000 entrées sur 24Mo, ca limite les entrées à 6Ko !)... Ne vaudrait il pas mieux de tout coller dans une table sqlite (sans stockage en mémoire).
    Question 1 : Utiliser une table SQLite, mais sans stocker en mémoire ? Comment ça se passe ?
    J'utilise une base de données SQLite pour enregistrer d'autres données dans l'application, mais je ne vois pas comment on peut aussi l'utiliser sans stocker en mémoire.

    Question 2 : Si j'utilise une table SQLite, je vais devoir modifier mon adapter et plutôt étendre CursorAdapter ?
    D'ailleurs en parlant de ça, il vaut mieux plutôt redéfinir CursorAdapter ou SimpleCursorAdapter ? Et quelle est la différence entre ces classes fournies dans le SDK, et dans la librairie support.v4 ?


    Citation Envoyé par nicroman Voir le message
    Si bien sur... cela doit redescendre... si cela ne redescend pas il y a un memory leak...
    Selon les messages du Logcat lors d'un GC_CONCURRENT, la taille du heap ne diminue pas lorsque je quitte l'activité où sont effectués les traitements sur cette grande liste.
    Comme dit dans mon précédent message, si je lance cette Activité, que je fais retour, que je la relance... plusieurs fois de suite, la taille augmente sans arrêt alors que l'activité est censée être détruite (ça passe bien dans le onDestroy).

    Question 3 : Comment trouver l'origine de cette "fuite" ?

    [EDIT] Je n'avais pas vu ton lien vers "MAT" lorsque j'ai écris la réponse, je vais jeter un coup d’œil là-dessus.

    Question 4 : Est-ce l'AsynTask peut être à l'origine du problème, sachant qu'il y a une référence vers un listener (créé par moi même, et implémenté dans cette activité) et une référence vers un context de l'activité ?
    J'ai d'ailleurs entendu parler de "WeakReference", mais je ne suis pas sûr de bien l'utiliser sans trop connaitre ses effets... et s'il est nécessaire aussi.


    Question 5 : Pourquoi est-ce le parser SAX déclenche plus de GC_CONCURRENT que le XmlPullParser ? Est-ce que c'est dangereux ?

  4. #4
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par gilloddon Voir le message
    Question 1 : Utiliser une table SQLite, mais sans stocker en mémoire ? Comment ça se passe ?
    J'utilise une base de données SQLite pour enregistrer d'autres données dans l'application, mais je ne vois pas comment on peut aussi l'utiliser sans stocker en mémoire.
    Les tables SQLite sont dans un fichier... donc l'idée est à la lecture d'un record:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    onXMLRecordEnded()
    {
        storeXMLRecordInDB();
        clearXMLRecord();
    }
    storeXMLRecordInDB()
    {
        insertIntoTableXXX();
        commit();
    }
    Maintenant si les données sont modifiées fréquemment, cela ne vaudra pas le coup... enfin je sais pas tout dépend de l'utilisation etc... dans tous les cas cela me semble hyper super étrange de "demander" 3000 records sur le net... (au dela de la centaine j'ai un doute ^^)

    Question 2 : Si j'utilise une table SQLite, je vais devoir modifier mon adapter et plutôt étendre CursorAdapter ?
    D'ailleurs en parlant de ça, il vaut mieux plutôt redéfinir CursorAdapter ou SimpleCursorAdapter ? Et quelle est la différence entre ces classes fournies dans le SDK, et dans la librairie support.v4 ?
    Oui c'est ca... la version du "support" permet de programmer pour Android 1.5 par exemple et utiliser les mêmes "fonctionalités" (peut-etre réduites) que les fonctions "natives" d'un Android 4.

    Question 4 : Est-ce l'AsynTask peut être à l'origine du problème, sachant qu'il y a une référence vers un listener (créé par moi même, et implémenté dans cette activité) et une référence vers un context de l'activité ?
    Il faudrait voir du code... les références croisées peuvent devenir une plaie, mais bon sans code difficile à dire.

    Question 5 : Pourquoi est-ce le parser SAX déclenche plus de GC_CONCURRENT que le XmlPullParser ? Est-ce que c'est dangereux ?
    En fait un gc est appelé quand un objet est alloué (et qu'il ne reste plus beaucoup de mémoire)... il est possible que le pull-parser fasse moins d'allocations. Dans tous les cas, ce n'est pas grave, tant que quand on quite l'activité, on revient à l'état initial (en tout cas dès le premier gc).

    Le "WeakReference" est simple à utiliser... Son avantage: en cas de gros probleme mémoire, la weak reference n'empeche pas de "collecter" l'objet pointé. Son inconvénient est qu'il ne corrige pas les bugs de memory leaks, il permet juste de "moins les voir"...

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 144
    Points : 118
    Points
    118
    Par défaut
    Citation Envoyé par nicroman Voir le message
    Il faudrait voir du code... les références croisées peuvent devenir une plaie, mais bon sans code difficile à dire.
    Alors, pour le code de l'AsyncTask, il est dans mon premier message.

    Pour ce qui est de l'activité, l'implémentation du listener correspond à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    public class ListActivity extends Activity implements OnItemClickListener, TextWatcher, MonListener
    {
     
    	private ListView listView;
    	private ClientAdapter adapter;
    	private EditText editTextFilter;
    	private ProgressDialog progressDialog;
     
     
    	@Override
        protected void onCreate(Bundle savedInstanceState)
        {
    	    super.onCreate(savedInstanceState);
    	    setContentView(R.layout.activity_list);
     
     
        	this.progressDialog = ProgressDialog.show(this, getResources().getString(R.string.common_wait), getResources().getString(R.string.progress_message), true);
     
     
    	    this.listView = (ListView) findViewById(R.id.opacListView);
    	    this.editTextFilter = (EditText) findViewById(R.id.opacEditTextFilter);
     
     
    	    String url = getIntent().getStringExtra("url");	
     
                ...	    
     
    	    XMLTask task = new XMLTask (url, this, this);
    	    task.execute();
        }
     
        @Override
        public void onError()
        {
    		this.progressDialog.dismiss();
    	    setResult(Tools.RESULT_CODE_EMPTY_LIST);
    	    finish(); return;
        }
     
    	@Override
        public void onSuccess(ClientAdapter adapter)
        {
    		this.adapter = adapter;
    		this.listView.setAdapter(adapter);
     
    	    this.listView.setOnItemClickListener(this);
    	    this.editTextFilter.addTextChangedListener(this);
     
    		this.progressDialog.dismiss();
        }
     
    ....
     
     
    }

Discussions similaires

  1. Parser un gros fichier XML
    Par Syyrius dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 06/11/2013, 14h54
  2. Parser un gros fichier xml (>500 Mb )
    Par kenzoshin dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 05/12/2012, 13h58
  3. Parser de gros fichiers XML en JavaSCript via SAX
    Par alatox dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 18/03/2010, 15h57
  4. Réponses: 2
    Dernier message: 25/05/2007, 15h52
  5. [C#] [XML] Traitement de gros fichiers XML (90 Mo)
    Par Pulsahr dans le forum Windows Forms
    Réponses: 20
    Dernier message: 01/12/2005, 14h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo