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 :

Résultat émulateur différent sur portable


Sujet :

Android

  1. #1
    Rédacteur

    Homme Profil pro
    Technical Lead Salesforce
    Inscrit en
    Février 2009
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technical Lead Salesforce

    Informations forums :
    Inscription : Février 2009
    Messages : 563
    Par défaut Résultat émulateur différent sur portable
    Bonjour, je développe une application android qui utilise une base de donnée MySQL.

    Sur mon émulateur, j'obtiens bien un résultat de ma base de données mais lorsque j'essaie sur mon téléphone, je n'obtiens rien.

    Je récupère des données de ma base de données sous format XML (script PHP).

    Comment puis-je vérifier ce que j'obtiens sur téléphone?
    - Mes articles
    - Consultant technique Salesforce
    - Salesforce Certified Administrator
    - Salesforce Certified Platform App Builder
    - Salesforce Certified Developper I
    - Salesforce Certified Sales Cloud
    - Salesforce Certified Service Cloud

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Affiche le Flux XML reçu dans le logs.

    http://mobile.tutsplus.com/tutorials...t_android-sdk/

  3. #3
    Rédacteur

    Homme Profil pro
    Technical Lead Salesforce
    Inscrit en
    Février 2009
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technical Lead Salesforce

    Informations forums :
    Inscription : Février 2009
    Messages : 563
    Par défaut
    Désolé de répondre si tard mais j'ai été beaucoup pris par mon travail..

    Je viens d'installer les logs que je vois avec mon téléphone (HTC Sensation) et effectivement, je n'ai pas le même résultat sur mon téléphone que sur l'émulateur.

    En y réfléchissant, est-ce que c'est possible par un quelconque moyen que la version sur mon téléphone soit synchrone et la version sur mon émulateur, asynchrone?
    - Mes articles
    - Consultant technique Salesforce
    - Salesforce Certified Administrator
    - Salesforce Certified Platform App Builder
    - Salesforce Certified Developper I
    - Salesforce Certified Sales Cloud
    - Salesforce Certified Service Cloud

  4. #4
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Je viens d'installer les logs que je vois avec mon téléphone (HTC Sensation) et effectivement, je n'ai pas le même résultat sur mon téléphone que sur l'émulateur.
    Pourrais tu nous en dire plus ?

  5. #5
    Rédacteur

    Homme Profil pro
    Technical Lead Salesforce
    Inscrit en
    Février 2009
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technical Lead Salesforce

    Informations forums :
    Inscription : Février 2009
    Messages : 563
    Par défaut
    Je veux dire que je récupère via un scipt PHP des données au format XML du genre :
    <rules>
    <rule>
    <id></id>
    <name></name>
    <description></description>
    </rule>
    </rules>
    Sur mon émulateur, je récupère bien quelque chose mais pas avec mon téléphone (j'ai mis des logs à chaque règle qu'il récupère et au final, rien ne s'écrit avec le téléphone).
    - Mes articles
    - Consultant technique Salesforce
    - Salesforce Certified Administrator
    - Salesforce Certified Platform App Builder
    - Salesforce Certified Developper I
    - Salesforce Certified Sales Cloud
    - Salesforce Certified Service Cloud

  6. #6
    Expert confirmé

    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
    Billets dans le blog
    3
    Par défaut
    Il va nous falloir du code là

  7. #7
    Rédacteur

    Homme Profil pro
    Technical Lead Salesforce
    Inscrit en
    Février 2009
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technical Lead Salesforce

    Informations forums :
    Inscription : Février 2009
    Messages : 563
    Par défaut
    Voilà ma fonction qui me renvoit une liste:
    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
    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
     
    public List<freeman.objects.Rules> parseRules(String url){
     
    		List<freeman.objects.Rules> listeRules = null;
     
    		XmlPullParser parser = Xml.newPullParser();
     
    		try{
     
    			// auto-detect the encoding from the stream
    			parser.setInput(this.getInputStream(url), null);
     
    			int eventType = parser.getEventType();
    			boolean done = false;
     
    			// La regle courrante du flux XML
    			freeman.objects.Rules currentRule = null;
     
    			// Tant que le parseur n'arrive pas a la fin du document 
    			while (eventType != XmlPullParser.END_DOCUMENT && !done){
     
    				String name = null;
    				switch (eventType){
     
    					// Dans le cas ou l'on commence le document XML
    					case XmlPullParser.START_DOCUMENT:
     
    						listeRules = new ArrayList<freeman.objects.Rules>();
    					break;
     
    					// Dans le cas où l'on commence une balise
    					case XmlPullParser.START_TAG:
    					name = parser.getName();
     
    					// Debut d'une regle
    					if (name.equalsIgnoreCase(RULE)){
     
    						currentRule = new freeman.objects.Rules();
     
    					}else if(currentRule != null){
     
    						if(name.equalsIgnoreCase(ID)){
     
    							currentRule.setId(Integer.parseInt(parser.nextText()));
     
    						}else if(name.equalsIgnoreCase(NAME)){
     
    					    	currentRule.setName(parser.nextText());
     
    						}else if(name.equalsIgnoreCase(DESCRIPTION)){
     
    							currentRule.setDescription(parser.nextText());
    						} 
    					}
    					break;
     
    					// Dans le cas ou l'on termine une regle
    					case XmlPullParser.END_TAG:
     
    						name = parser.getName();
     
    						if (name.equalsIgnoreCase(RULE) && currentRule != null){
     
    							// Ajout de la regle a la liste
    							listeRules.add(currentRule);
     
    						}else if (name.equalsIgnoreCase(RULE)){
    							done = true;
    						}
     
    					break;
    				}
     
    				eventType = parser.next();
    			}
    		} catch (Exception e) {
    			throw new RuntimeException(e);
    		}
     
    		return listeRules;
    	}
    - Mes articles
    - Consultant technique Salesforce
    - Salesforce Certified Administrator
    - Salesforce Certified Platform App Builder
    - Salesforce Certified Developper I
    - Salesforce Certified Sales Cloud
    - Salesforce Certified Service Cloud

  8. #8
    Expert confirmé

    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
    Billets dans le blog
    3
    Par défaut
    Non mais je ne met pas en doute le parser....
    Le code est "fermé" (sans appel à l'extérieur), donc si il tourne sur une machine il tourne partout. Là ou un code peut se comporter différement c'est lors des interactions avec le reste du système...

    Donc en particulier la fonction getInputStream(url)....
    Quelle est la valeur de URL, que renvoit getInputStream() ?
    Y a-t-il une exception ?
    Dans quel cadre la fonction parseRules est-elle appelée ?

    Il y a bien une gestion des exceptions dans la fonction, mais elle est quasiment inutile (d'ailleurs je n'en comprends pas l'interêt... pourquoi transformer toutes les exceptions en runtime ?)

  9. #9
    Rédacteur

    Homme Profil pro
    Technical Lead Salesforce
    Inscrit en
    Février 2009
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technical Lead Salesforce

    Informations forums :
    Inscription : Février 2009
    Messages : 563
    Par défaut
    Citation Envoyé par nicroman Voir le message
    Non mais je ne met pas en doute le parser....
    Le code est "fermé" (sans appel à l'extérieur), donc si il tourne sur une machine il tourne partout. Là ou un code peut se comporter différement c'est lors des interactions avec le reste du système...
    Je ne m'y connais pas du tout en Androïd, j'ai repris un exercice que j'avais réalisé en cours il y a 2 ans donc il se peut fortement qu'il ne soit pas à jour ou mal développé.

    Citation Envoyé par nicroman Voir le message
    Donc en particulier la fonction getInputStream(url)....
    Quelle est la valeur de URL, que renvoit getInputStream() ?
    Voilà ma fonction getInputStream :
    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
     
    private InputStream getInputStream(String strUrl) {
     
    	InputStream res=null; 
     
    	try{
    		URL url = new URL(strUrl);
    		res = url.openConnection().getInputStream();		
    	}catch(MalformedURLException e){
    		throw new RuntimeException(e);
    	}catch(IOException e){
    		Log.d("pb IO", e.getMessage());
    	}
     
    	if(res ==null){
    		res = new ByteArrayInputStream("<rule></rule>".getBytes());
    	}
     
    	return res;
    }
    Citation Envoyé par nicroman Voir le message
    Y a-t-il une exception ?
    Dans mes logs, je ne vois aucune exception qui s'affiche.

    Citation Envoyé par nicroman Voir le message
    Dans quel cadre la fonction parseRules est-elle appelée ?
    Elle est appelée lorsque j'ai besoin de récupérer toutes les règles disponibles et actuellement dans mon application, elle est appelée qu'à un seul endroit.

    Citation Envoyé par nicroman Voir le message
    Il y a bien une gestion des exceptions dans la fonction, mais elle est quasiment inutile (d'ailleurs je n'en comprends pas l'interêt... pourquoi transformer toutes les exceptions en runtime ?)
    Comme je l'ai dis plus haut, mon code date de 2 ans puis je ne connais pas toutes les exceptions possibles;
    - Mes articles
    - Consultant technique Salesforce
    - Salesforce Certified Administrator
    - Salesforce Certified Platform App Builder
    - Salesforce Certified Developper I
    - Salesforce Certified Sales Cloud
    - Salesforce Certified Service Cloud

  10. #10
    Expert confirmé

    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
    Billets dans le blog
    3
    Par défaut
    Bon... prenons le code petit à petit....

    getInputStream() par exemple....
    Elle prend une string en paramètre, et renvoie un InputStream....
    Comment signale-t-elle à l'appelant que la chaîne n'est pas bonne ?
    Comment signale-t-elle à l'appelant qu'il y a eu une erreur (et non simplement une liste de règles vide ?)

    Voila la tête que devrait avoir cette fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    private InputStream getInputStream(String strUrl) 
        throws MalformedURLException, IOException
    {
    	URL url = new URL(strUrl);
    	return url.openConnection().getInputStream();
    }
    Pareil coté parseur, sauf que la, éventuellement, on voudrait "traduire" une exception XML, mais surtout *Proteger* la ressource "InputStream" ouverte et qui pourrait (du fait de l'exception) rester ouverte trop longtemps:
    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
     
    public List<freeman.objects.Rules> parseRules(String url)
        throws MalformedURLException, IOException
    {
         List<freeman.objects.Rules> listeRules = null;
         XmlPullParser parser = Xml.newPullParser();
         InputStream is = getInputStream(url);
         try {
             parser.setInput(is,null);
              ....
         } catch (EXCEPTION DU PARSER UNIQUEMENT ex) {
              Log.e("XMLParser","Failed to parse XML",ex);
              throw new IOException("Failed to parse XML data");
         } finally {
              if (is != null) try { is.close(); } catch (Exception ex) { Log.e("XMLParser","Failed to close stream",ex); }
         }
         return liseRules;
    }
    Déjà, il y aura plus d'exception affichées à mon avis ^^

    En général on ne catch jamais une exception sauf si:
    * On est prêt à la traduire (et pas dans une "Runtime" qui indiquerait un 'mauvais code')
    * On est prêt à continuer avec (warning)
    * On l'affiche à l'utilisateur.

    Elle est appelée lorsque j'ai besoin de récupérer toutes les règles disponibles et actuellement dans mon application, elle est appelée qu'à un seul endroit.
    Oui, mais *OU* ?
    Si c'est dans un onXXXXX() par exemple cela ne marchera pas...

  11. #11
    Rédacteur

    Homme Profil pro
    Technical Lead Salesforce
    Inscrit en
    Février 2009
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technical Lead Salesforce

    Informations forums :
    Inscription : Février 2009
    Messages : 563
    Par défaut
    Citation Envoyé par nicroman Voir le message
    Oui, mais *OU* ?
    Si c'est dans un onXXXXX() par exemple cela ne marchera pas...
    Dans mon onCreate(), je fais appel à une méthode d'un mapper qui elle, fait appel à la méthode parseRules(String url).

    En lançant mon application avec mon téléphone, j'ai bien eu une erreur de type NullPointerException dans ma méthode parseRules() mais je ne sais pas où exactement.

    Au lieu de faire remonter des erreurs dans mes méthodes, ce ne serait pas mieux pour débuger de faire plusieurs 'try catch' dans ma méthode parseRules pour mieux localiser d'où vient le problème?
    - Mes articles
    - Consultant technique Salesforce
    - Salesforce Certified Administrator
    - Salesforce Certified Platform App Builder
    - Salesforce Certified Developper I
    - Salesforce Certified Sales Cloud
    - Salesforce Certified Service Cloud

  12. #12
    Expert confirmé

    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
    Billets dans le blog
    3
    Par défaut
    Ben non justement

    Une exception est ce qu'elle indique: un état exceptionnel....
    Et il ne faut les traiter que *exceptionnelement*....

    Je m'explique: Une exception "NullPointerException" est une erreur de programmeur... elle ne devrait *jamais* être catchée, et fermer l'application directement. D'ailleurs dans ce cas, android te fera un joli log bien propre avec toutes les infos de l'exception (voir ci desous).

    Pour le "traitement" d'erreurs attendues (par exemple IOException lors de la lecture d'un fichier), il va falloir la laisser remonter jusqu'au moment ou la notion de fichier disparaît... ceci est souvent au niveau de l'UI qui va pouvoir faire un joli "Toast" pour afficher à l'utilisateur que ça a foiré.

    Après, il y a la partie "debug"... A chaque fois qu'une exception est catchée pour une raison ou une autre, et non "traduite" (une nouvelle exception est lancée avec l'exception originelle en 'cause'), il *FAUT* faire une ligne de log... Mais pas un simple "Log.d("pb IO", e.getMessage());" (qui fait finalement la même chose quasiment que le system.out), mais bien en PASSANT l'exception au système de log (et une exception c'est très rarement du "debug") donc un truc genre: "Log.e("MONTAG","pb IO",e);" Je rappelle que le premier parametre des fonctions Log est un "tag" permettant de filtrer, pas un message perso genre "probleme IO". Pour info, je met quasi toujours "getClass().getPackage()" en tag.

    Et hop, d'un coup, tu va avoir toutes les informations concernant l'exception, qui l'a lancée, à quel endroit du code, à quoi elle est due...


    Dans tous les cas, quand eclipse rale parcequ'une exception n'est pas "catchée", NE JAMAIS utiliser la facilité du try/catch autour du code !
    Ou il fait sens d'avoir un try/catch (et il y est déjà, donc eclipse proposera un "add to existing try"), ou il n'y est pas, et il suffit de déclarer la fonction comme lançant l'exception.

  13. #13
    Rédacteur

    Homme Profil pro
    Technical Lead Salesforce
    Inscrit en
    Février 2009
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technical Lead Salesforce

    Informations forums :
    Inscription : Février 2009
    Messages : 563
    Par défaut
    Si j'ai bien compris, pour mon NullPointerException, je ne dois pas la catcher mais il faut bien la traiter et voir exactement, ce qu'il ne va pas..?
    - Mes articles
    - Consultant technique Salesforce
    - Salesforce Certified Administrator
    - Salesforce Certified Platform App Builder
    - Salesforce Certified Developper I
    - Salesforce Certified Sales Cloud
    - Salesforce Certified Service Cloud

  14. #14
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    NullPointerException
    Généralement quand on a un NUllPointeurException c'est qu'il y a une erreur dans le code. Cela ne doit pas arriver, il faut que tu testes avant si ta variable est nulle et ci c'est le cas que tu traites ce cas là en conséquence.

    Comme te l'a expliqué Nicroman.

  15. #15
    Rédacteur

    Homme Profil pro
    Technical Lead Salesforce
    Inscrit en
    Février 2009
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technical Lead Salesforce

    Informations forums :
    Inscription : Février 2009
    Messages : 563
    Par défaut
    Désolé de revenir tard mais j'ai été très pris par mon travail ces derniers temps..

    J'ai posé des try catch dans mes méthodes et apparemment il s'agit bien d'un NullPointerException mais l'erreur est :
    println needs a message
    Ce qui m'avance bien..

    Le bout de code qui provoque l'erreur est celui-là :
    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
     
    private InputStream getInputStream(String strUrl) throws MalformedURLException, IOException, NullPointerException, Exception {
     
    		InputStream content = null;
    		  try {
    		    HttpClient httpclient = new DefaultHttpClient();
    		    HttpResponse response = httpclient.execute(new HttpGet(strUrl));
    		    content = response.getEntity().getContent();
    		  } catch (MalformedURLException e) {
    			  Log.e("MalformedURLException", "MalformedURLException dans getInputStream()");
    			  throw new MalformedURLException("MalformedURLException dans getInputStream()");
    		  } catch (IOException e) {
    			  Log.e("IOException", "IOException dans getInputStream()");
    			  throw new IOException("IOException dans getInputStream()");
    		  } catch (NullPointerException e) {
    			  String err = (e.getMessage()==null)?"No message":e.getMessage();
    			  Log.e("NullPointerException dans getInputStream()", err);
    			  throw new NullPointerException(err);
    		  } catch (Exception e) {
    			  Log.e("Exception", e.getMessage());
    			  throw new Exception(e.getMessage());
    		  }
     
    		  return content;
    	}
    Qu'est-ce que je peux faire pour plus approfondir mon erreur?
    - Mes articles
    - Consultant technique Salesforce
    - Salesforce Certified Administrator
    - Salesforce Certified Platform App Builder
    - Salesforce Certified Developper I
    - Salesforce Certified Sales Cloud
    - Salesforce Certified Service Cloud

  16. #16
    Expert confirmé

    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
    Billets dans le blog
    3
    Par défaut
    Déjà poster le logcat entier....

    Dans le dernier code, les Log ne servent à rien (ni les try/catch d'ailleurs)
    Pire encore, non seulement tu ne log pas l'erreur (il n'y a pas l'exception passée en dernier parametre comme dans: Log.e(TAG,MESSAGE,exception), mais tu réduis à néant sa stacktrace en envoyant une nouvelle exception (autant faire "throw e;" et pas "throw new ....();" )

    Encore une fois, on ne fait jamais disparaître une exception...
    ou on fait catch l'exception (catch, pas de throw) et dans ce cas, il FAUT un Log.e(...,exception);
    ou on 'traduit' l'exception en une autre, et dans ce cas il faut passer l'exception initiale en 'cause' de la nouvelle exception envoyée,
    ou on ne fait rien du tout (pas de catch)...

    Dans les deux derniers cas, le log est optionnel (puisqu'en suivant la règle il sera fait plus 'haut' dans la pile)

  17. #17
    Rédacteur

    Homme Profil pro
    Technical Lead Salesforce
    Inscrit en
    Février 2009
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technical Lead Salesforce

    Informations forums :
    Inscription : Février 2009
    Messages : 563
    Par défaut
    J'ai revu mon code (sûrement pas parfait mais j'essaie) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public List<freeman.objects.Rules> getRules(){
     
    		try{
     
    			return this.parseRules(URL_RULES);
     
    		}catch(Exception e){
     
    			Log.e(getClass().getName(), "Exception à la récupération des règles", e);
     
    			return new ArrayList<freeman.objects.Rules>();
    		}
    	}
    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
    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
     
    public List<freeman.objects.Rules> parseRules(String url) throws MalformedURLException, IOException, NullPointerException, XmlPullParserException{
     
    		List<freeman.objects.Rules> listeRules = null;
    	    XmlPullParser parser = Xml.newPullParser();
    	    InputStream inputStream = getInputStream(url);
     
    		parser.setInput(inputStream, null);
    		int eventType = parser.getEventType();
     
    		try{
    			boolean done = false;
     
    			// La regle courrante du flux XML
    			freeman.objects.Rules currentRule = null;
     
    			// Tant que le parseur n'arrive pas a la fin du document 
    			while (eventType != XmlPullParser.END_DOCUMENT && !done){
     
    				String name = null;
    				switch (eventType){
     
    					// Dans le cas ou l'on commence le document XML
    					case XmlPullParser.START_DOCUMENT:
     
    						listeRules = new ArrayList<freeman.objects.Rules>();
    					break;
     
    					// Dans le cas où l'on commence une balise
    					case XmlPullParser.START_TAG:
    					name = parser.getName();
     
    					// Debut d'une regle
    					if (name.equalsIgnoreCase(RULE)){
     
    						currentRule = new freeman.objects.Rules();
     
    					}else if(currentRule != null){
     
    						if(name.equalsIgnoreCase(ID)){
     
    							currentRule.setId(Integer.parseInt(parser.nextText()));
     
    						}else if(name.equalsIgnoreCase(NAME)){
     
    					    	currentRule.setName(parser.nextText());
     
    						}else if(name.equalsIgnoreCase(DESCRIPTION)){
     
    							currentRule.setDescription(parser.nextText());
    						} 
    					}
    					break;
     
    					// Dans le cas ou l'on termine une regle
    					case XmlPullParser.END_TAG:
     
    						name = parser.getName();
     
    						if (name.equalsIgnoreCase(RULE) && currentRule != null){
     
    							// Ajout de la regle a la liste
    							listeRules.add(currentRule);
     
    						}else if (name.equalsIgnoreCase(RULE)){
    							done = true;
    						}
     
    					break;
    				}
     
    				eventType = parser.next();
    			}
    		} catch(NullPointerException e) {
    			Log.e("NullPointerException dans parseRules()", "Erreur au parsage du flux XML", e);
    			throw e;
    		} catch(MalformedURLException e) {
    			Log.e("MalformedURLException dans parseRules()", "Fichier XML mal formé", e);
    			throw e;
    		} catch(IOException e) {
    			Log.e("IOException dans parseRules()", "Erreur lecture du flux XML", e);
    			throw e;
    		} catch (Exception e) {
    			Log.e("Exception dans parseRules()", "", e);
    		} finally {
    	          if (inputStream != null){
    	        	  try { 
    	        		  inputStream.close(); 
    	        	  }catch(Exception ex){
    	        		  Log.e("XMLParser","Failed to close stream",ex);
    	        	  }
    	          }
    	     }
     
    		return listeRules;
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    private InputStream getInputStream(String strUrl) throws MalformedURLException, IOException, NullPointerException {
     
    		URL url = new URL(strUrl);
     
    		return url.openConnection().getInputStream();
    	}
    Voici mon erreur :
    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
    12-06 22:40:17.772: E/freeman.models.RulesMapper(13873): Exception à la récupération des règles
    12-06 22:40:17.772: E/freeman.models.RulesMapper(13873): android.os.NetworkOnMainThreadException
    12-06 22:40:17.772: E/freeman.models.RulesMapper(13873): 	at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1178)
    12-06 22:40:17.772: E/freeman.models.RulesMapper(13873): 	at java.net.InetAddress.lookupHostByName(InetAddress.java:394)
    12-06 22:40:17.772: E/freeman.models.RulesMapper(13873): 	at java.net.InetAddress.getAllByNameImpl(InetAddress.java:245)
    12-06 22:40:17.772: E/freeman.models.RulesMapper(13873): 	at java.net.InetAddress.getAllByName(InetAddress.java:220)
    12-06 22:40:17.772: E/freeman.models.RulesMapper(13873): 	at libcore.net.http.HttpConnection.<init>(HttpConnection.java:71)
    12-06 22:40:17.772: E/freeman.models.RulesMapper(13873): 	at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
    12-06 22:40:17.772: E/freeman.models.RulesMapper(13873): 	at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351)
    12-06 22:40:17.772: E/freeman.models.RulesMapper(13873): 	at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86)
    12-06 22:40:17.772: E/freeman.models.RulesMapper(13873): 	at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
    12-06 22:40:17.772: E/freeman.models.RulesMapper(13873): 	at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)
    12-06 22:40:17.772: E/freeman.models.RulesMapper(13873): 	at libcore.net.http.HttpEngine.connect(HttpEngine.java:303)
    12-06 22:40:17.772: E/freeman.models.RulesMapper(13873): 	at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
    12-06 22:40:17.772: E/freeman.models.RulesMapper(13873): 	at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
    12-06 22:40:17.772: E/freeman.models.RulesMapper(13873): 	at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273)
    12-06 22:40:17.772: E/freeman.models.RulesMapper(13873): 	at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168)
    12-06 22:40:17.772: E/freeman.models.RulesMapper(13873): 	at freeman.models.RulesMapper.getInputStream(RulesMapper.java:184)
    12-06 22:40:17.772: E/freeman.models.RulesMapper(13873): 	at freeman.models.RulesMapper.parseRules(RulesMapper.java:88)
    12-06 22:40:17.772: E/freeman.models.RulesMapper(13873): 	at freeman.models.RulesMapper.getRules(RulesMapper.java:53)
    12-06 22:40:17.772: E/freeman.models.RulesMapper(13873): 	at freeman.activities.Rules.onCreate(Rules.java:130)
    Visiblement, il y a un problème avec la connexion HTTP.

    La ligne 184 de RulesMapper correspond à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    return url.openConnection().getInputStream();
    Qui correspond au return de ma fonction getInputStream().

    Ce que retourne l'url :
    <rules>
    <rule>
    <id>3</id>
    <name>,hgj</name>
    <description>hgjhgjhg</description>
    </rule>
    <rule>
    <id>5</id>
    <name>ghghfghgfhfghf</name>
    <description>fdgfghgfhfg</description>
    </rule>
    </rules>
    Qu'est-ce qui ne vas pas?
    Aurais-je oublier de donner une permission dans mon manifest.xml en plus de :
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    ?
    - Mes articles
    - Consultant technique Salesforce
    - Salesforce Certified Administrator
    - Salesforce Certified Platform App Builder
    - Salesforce Certified Developper I
    - Salesforce Certified Sales Cloud
    - Salesforce Certified Service Cloud

  18. #18
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    L'erreur est pourtant claire : "network on main thread". La traduire suffit à connaître la raison.
    Faire des appels réseaux sur le thread principal (thread graphique) EST une mauvaise pratique. Avant Android 3, il n'y avait pas d'erreur. Vu que c'est une mauvaise pratique, peu de personnes auraient dues faire comme ça. Malheureusement non. D'où l'introduction de cette exception assez parlante.

    Donc, pour éviter d'avoir ce souci, il faut faire les opérations réseaux dans un thread à part. On privilégie très souvent une AsyncTask pour ça.

    Par extension, tout traitement pouvant être long DOIT être fait dans un thread à part, l'UI ne doit en aucun cas geler, et le terminal mobile doit toujours répondre vite aux actions utilisateurs.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  19. #19
    Rédacteur

    Homme Profil pro
    Technical Lead Salesforce
    Inscrit en
    Février 2009
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technical Lead Salesforce

    Informations forums :
    Inscription : Février 2009
    Messages : 563
    Par défaut
    J'ai résolu mon problème et du coup, j'ai créé une fonction qui utilise un autre un autre thread pour faire le traitement, comme ça, je peux faire mon traitement quand je veux, résolu.

    Et je suppose que j'obtenais l'erreur parce que mon téléphone est en 4.0.3 et la version du soft en 2.3.3?

    En tout cas, c'est résolu.
    - Mes articles
    - Consultant technique Salesforce
    - Salesforce Certified Administrator
    - Salesforce Certified Platform App Builder
    - Salesforce Certified Developper I
    - Salesforce Certified Sales Cloud
    - Salesforce Certified Service Cloud

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Résultats de requête différents sur script ou phpmyadmin
    Par Invité dans le forum PHP & Base de données
    Réponses: 16
    Dernier message: 26/02/2013, 17h21
  2. [AC-2007] [EX-2010] Résultat de la requête différent sur Access ou Excel
    Par vibos dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 25/02/2013, 14h18
  3. [SimpleXML] 3 résultats différents sur 3 hébergeurs
    Par elcoyotos dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 28/01/2012, 09h15
  4. [XSLT 1.0] Résultats différents sur la lecture de valeurs
    Par kornterstrike dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 22/02/2011, 15h41
  5. [MySQL] Résultat de requête différent sur 2 serveurs identiques
    Par schlitters dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 17/12/2005, 01h24

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