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 :

InputStream incomplet en 3G


Sujet :

Android

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 4
    Points : 4
    Points
    4
    Par défaut InputStream incomplet en 3G
    Bonjours a tous,

    Voila je dois récupérer des données via un WebService, les données renvoyé par le serveur sont stocké dans un InputStream puis parser via un DocumentBuilderFactory, lorsque je suis connecté en wifi j'y accède (au WebService) via une adresse privée et il n'y a aucun problème.
    Lorsque que je suis en 3G j'utilise une adresse public, l'InputStream récupéré semble incomplet puisque lorsque je tente de le parser, une exception est généré :
    org.xml.sax.SAXParseException: unterminated entity ref (position:ENTITY_REF &@1:27 in java.io.InputStreamReader@2b085d68)
    J'ai remarqué que lorsque je debugué mon application si je resté longtemps sur un point d'arrêt ou autres l'InputStream est parsé "quasiment" sans problème.....comme si mon InputStream n'était pas récupéré complètement, ou qu'il lui faudrait plus de temps.
    Je précise que la réponse renvoyé par le serveur est correct.

    Le code où je me connecte au serveur et récupère la réponse

    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
    public SOAPrequest(Context p_context)
    	{
    		//On initialise les variables
    		_context = p_context;
    		_methodName = "Companies";
    		_nameSpace = "nav/system";
    		_parameters = new HashMap<String, String>();
    		if (isNetworkAvailable())
    		{
    			//Une connexion Internet a ÈtÈ dÈtectÈe
    			try
    			{
    				//On crÈe l'URL
    				createUrl("systemService");
     
    				//On ouvre la connexion
    				_connection = (HttpURLConnection) _url.openConnection();
     
    				//On ajoute les Headers
    				addHeaders(true);
     
    				//On crÈe le corps de la requÍte SOAP
    				createSoapBody();
     
    				//On crÈe l'enveloppe
    				String _soap = createSoapEnvelope();
     
    				//On se connecte
    				_connection.connect();
     
    				//On Ècrit la requÍte SOAP
    				OutputStream _request = null;
    				_request = _connection.getOutputStream();
    				_request.write(_soap.getBytes(), 0, _soap.getBytes().length);
     
     
    				//On rÈcupËre l'erreur s'il y en a une
    				if (_connection.getResponseCode() >= 300)
    				{
    					//Il y a eu une erreur
    					_erreur = _connection.getResponseMessage();
    				}
    				else
    				{
    					//Aucune erreur trouvÈe
    					_erreur = "";
    				}
     
    				//On rÈcupËre la rÈponse s'il y en a une
    				_reponse = _connection.getInputStream();
    				Log.e("PARSE", _reponse.toString());
    				//On ferme la requÍte
    				_request.close();
    			}
    			catch (IOException e)
    			{
     
    				e.printStackTrace();
    			}
    		}
    		else
    		{
    			//Aucune connexion Internet dÈtectÈe
    			_erreur = "Aucune connection Internet dÈtectÈe, veuillez vous reconnectez";
    		}
    	}
    Le code de mon parser :
    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
    public static ArrayList<String> parseToListCompany(InputStream p_reponse)
    	{
    		ArrayList<String> _listContactGeo = new ArrayList<String>();
    		DocumentBuilderFactory _factory = DocumentBuilderFactory.newInstance();
    		DocumentBuilder builder = null;
     
    			// on crÈÈ un DOM depuis l'inputStream recu en parametre
     
    			try {
    				builder = _factory.newDocumentBuilder();
    			} catch (ParserConfigurationException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			Document _dom = null;
     
    			try {
    				_dom = builder.parse(p_reponse);
    			} catch (SAXException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
     
    			try {
    				p_reponse.close();
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
     
    			Element _racine = _dom.getDocumentElement();
    			NodeList _listeElement = _racine.getElementsByTagName("return_value");
    			int length = _listeElement.getLength();
    			for(int index_listElement=0 ; index_listElement < length ; index_listElement++)
    			{
    				Element element = (Element)_listeElement.item(index_listElement);
    				//String _chaine =element.getNodeName();
    				String _fieldName=element.getTextContent();
    				_listContactGeo.add(_fieldName);
     
    			}
    		return _listContactGeo;
    	}
    Merci

  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
    Il y a bien des choses à dire sur le code lui-même....

    http://www.oracle.com/technetwork/ja...35099.html#367
    Except for variables, all instance, class, and class constants are in mixed case with a lowercase first letter. Internal words start with capital letters. Variable names should not start with underscore _ or dollar sign $ characters, even though both are allowed.
    Sinon il y a beaucoup trop de try/catch et pas assez de "throws" dans la déclaration des fonctions à mon avis...

    Surtout un constructeur (SOAPrequest(Context p_context)) devrait ou envoyer une exception ou mettre l'objet dans un état valide. Ce qui n'est pas le cas ici...

    Utilisation de Log.e("PARSE", _reponse.toString()); sans exception... (si il y a une erreur, a priori il doit y avoir une exception), ou alors ce devrait être Log.i
    (voire Log.d si c'est pour afficher des informations de debug)

    Même genre de commentaires sur parseToListCompany()
    Il est étonnant qu'une fonction qui utilise un InputStream ne lève pas d'exception IOException
    Un close() de l'InputStream est dans cette fonction... ce qui est contraire aux principes des ressources: Le close() doit être fait par celui qui a fait l'open():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    InputStream is = null;
    try {
       is = ...openStream();
       doSomethingWithStream(is);
    } finally {
       if (is != null) try { is.close(); } catch (Exception ex) { Log.wtf("EEEE","Failed to gracelully close stream",ex); }
    }
    La gestion des exceptions est erronée:
    Que se passe-t-il si builder = _factory.newDocumentBuilder(); lève une exception (ParserConfigurationException) ? builder eset null, et ... on continue... NullPointerException a l'opération suivante.

    Pareil ensuite: exception dans _dom = builder.parse(p_reponse); ? On continue quand même, et on fait _dom.getDocumentElement(); => NullPointerException
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Merci, de votre réponse.
    Je suis tout à fait d'accord concernant le nomage des variables cependant il ne s'agit pas de mon code, pour le moment je dois corriger les bugs.

    Etant débutant je n'ai pas tous compris, pourquoi le constructeur de SOAPRequest devrait générer une exception ? ou mettre l'object en état valide (ce qui veut dire ?)
    Pourquoi une fonction qui utilise un InputStream devrait généré un exception ?

    J'ai modifié SOAPrequest comme ceci :
    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
    public ArrayList<String> getListOfCompanies(Context p_context)
    	{
    		//On initialise les variables
    		_context = p_context;
    		_methodName = "Companies";
    		_nameSpace = "nav/system";
    		_parameters = new HashMap<String, String>();
     
    		ArrayList<String> objReturn = new ArrayList<String>();
     
    		if (isNetworkAvailable())
    		{
    			//Une connexion Internet a ÈtÈ dÈtectÈe
    			try
    			{
    				//On crÈe l'URL
    				createUrl("systemService");
     
    				//On ouvre la connexion
    				_connection = (HttpURLConnection) _url.openConnection();
     
    				//On ajoute les Headers
    				addHeaders(true);
     
    				//On crÈe le corps de la requÍte SOAP
    				createSoapBody();
     
    				//On crÈe l'enveloppe
    				String _soap = createSoapEnvelope();
     
    				//On se connecte
    				_connection.connect();
     
    				//On Ècrit la requÍte SOAP
    				OutputStream _request = null;
    				_request = _connection.getOutputStream();
    				_request.write(_soap.getBytes(), 0, _soap.getBytes().length);
     
    				//On rÈcupËre l'erreur s'il y en a une
    				if (_connection.getResponseCode() >= 300)
    				{
    					//Il y a eu une erreur
    					_erreur = _connection.getResponseMessage();
    				}
    				else
    				{
    					//Aucune erreur trouvÈe
    					_erreur = "";
    				}
     
    				//On rÈcupËre la rÈponse s'il y en a une
    				_reponse = _connection.getInputStream();
    				objReturn = ParsersListCompanies.parseToListCompany(_reponse);
    				//On ferme la requÍte
    				_request.close();
    			} catch (IOException ex) {
    				Log.wtf("EEEE","Failed to gracelully close stream",ex);
    			}
    			finally {
    				  if (_reponse != null) 
    					  try { _reponse.close(); } 
    				  catch (Exception ex) { 
    					  Log.wtf("EEEE","Failed to gracelully close stream",ex); 
    					  }
    			}
     
    		}
    		else
    		{
    			//Aucune connexion Internet dÈtectÈe
    			_erreur = "Aucune connection Internet dÈtectÈe, veuillez vous reconnectez";
    		}
     
    		return objReturn;
    	}
    Pour lui l'inputStream n'est pas nul est il ferme bien la connection. Mais il catch dans le parser.

    Par contre en wifi sa marche sans problème
    Comment puis-je voir ce que contient mon inputStream avant de le parser ?

Discussions similaires

  1. InputStream Incomplet lors d'une reception
    Par zwoke dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 06/10/2008, 14h47
  2. Transformer un String en InputStream
    Par felix79 dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 07/07/2004, 12h18
  3. [Debutant]Nom de fichiers incomplets
    Par Drizzt [Drone38] dans le forum MFC
    Réponses: 3
    Dernier message: 04/06/2004, 16h33
  4. Transformer un OutputStream en un InputStream
    Par glRaZ dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 29/04/2004, 11h10
  5. [Servlet][IO]Ecrire un File à partir d'un InputStream
    Par ravioli dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 04/02/2004, 10h15

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