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 :

Lecture xml fonctionne, puis ne fonctionne plus sans raison


Sujet :

Android

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 43
    Points : 29
    Points
    29
    Par défaut Lecture xml fonctionne, puis ne fonctionne plus sans raison
    Bonjour à tous, je permets de vous solliciter pour un problème fort étrange.

    Voici mon code:
    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
    public class MainActivity extends Activity {
     
    	 ArrayList<String> info =  new ArrayList<String>(); 
    		String msg;
     
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		new TAsyncTask().execute();
    	}
     
    	@Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		// Inflate the menu; this adds items to the action bar if it is present.
    		getMenuInflater().inflate(R.menu.activity_main, menu);
    		return true;
    	}
     
    	private class TAsyncTask extends AsyncTask<Void, Void, Void> {
     
            protected Void doInBackground(Void... params) {
     
         	 try {
        				 URL url = new URL("MonUrl");
       			        DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
       			        InputStream in = url.openStream() ;
       			        Document doc =  docBuilder.parse(new InputSource(in));
       			        doc.getDocumentElement().normalize();
       			      NodeList nodeList = doc.getElementsByTagName("DemandeActivation");
       			        for (int i = 0; i < nodeList.getLength(); i++) {
     
       			        Node node = nodeList.item(i);
       			        Element fstElmnt = (Element) node;
       			        info.add(fstElmnt.getAttribute("msg"));
       			        }
     
       				} catch (Exception e) {
       					Log.e("TAG","XML parsing errror",e);
       				}
     
            	return null;
            }
     
            protected void onProgressUpdate( Void... progress) {
     
            }
     
            protected void onPostExecute(Void result) {
     
            	Toast.makeText(MainActivity.this,String.valueOf(msg=info.get(0).toString()), 0).show(); 	
     
            }
    	}
    C'est un code qui me permet de lire un fichier xml depuis un site. Ce code fonctionne parfaitement.

    Il fonctionne sous Eclipse, mais lorsque je le lance sur une tablette Android il ne fonctionne pas et me dit que mon Application s'est arrêté.

    Alors, je ne comprends pas, je reboot ma tablette et là comme par magie mon application fonctionne.

    Avez-vous une raison à cela? :/

    Je vous remercie d'avance

  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 fonctionne sous Eclipse
    Ca veut dire qu'il compile ? ou qu'il fonctionne dans un AVD ?

    me dit que mon Application s'est arrêté.
    Donc il y a eu une exception.
    Si il y a eu une exception elle est dans les logs
    Brancher la tablette en mode debug... et regarder les logs, ou installer une application pour lire les logs directement sur la tablette.

    Nous fournir l'exception et la stacktrace associée histoire qu'on puisse aider.

    Au pire créer un AVD avec la même version android que la tablette et essayer sur cet AVD.

    Sinon, juste une petite remarque sur le code....
    L'AsyncTask modifie en "live" des données de l'activité (qui sont accessible par le thread UI), c'est très dangreux....
    Il vaut mieux que l'AsyncTask doInBackground ait sa propre copie locale, qu'il retourne à la fin... et que le onPostExecute (qui la recoit en paramètre) la colle dans l'activité... Cela sera "atomique" et évitera de synchroniser l'objet pour pouvoir le modifier en toute sécurité.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 43
    Points : 29
    Points
    29
    Par défaut
    Je te remercie de ta réponse nicroman.

    Oui mon application fonctionne en AVD. Je l'ai également testé avec un AVD ayant la même version que ma tablette android et cela fonctionne.

    J'ai trouvé mon problème, c'est juste que ma tablette a de gros problèmes de wifi et donc elle a du mal à avoir accès à internet.

    Mon application doit fonctionner sur un smartphone. De ce fait, le smarphone aura la connexion 3G en plus qu'une tablette.

    Du coup, je me demandais, est-ce à moi de gérer la connexion 3G ou Wifi? (ajouter permission, modifier mon code,...).

    Sachant que pour mon application il me faut juste une connexion internet.

  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
    Non mais cela ressemble à une mauvaise gestion des erreurs...

    En particulier:
    Toast.makeText(MainActivity.this,String.valueOf(msg=info.get(0).toString()), 0).show();

    Que se passe-t-il en cas d'erreur dans le process ?
    L'exception y est bien gérée => impeccable....
    Mais la fonction ne le dit pas au "onPostProcess"... du coup celui-ci fait comme si aucune erreur n'avait eu lieu (et si il y'avait des données) : info.get(0) => IndexOutOfBoundException

    On déclare "info" comme private...
    Dans la tâche:
    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
     
    class TAsyncTask extends AsyncTask<Void, ArrayList<String>, Void> {
    private Exception error;
    public ArrayList<String> doInBackground(Void...params)
    {
        ArryList<String> ret = new ArrayList<String>();
        try {
             ... on remplit "ret" (et pas info)
        } catch (Exception ex) {
            Log.e(...); // <= super
            this.error = e;
        }
        return ret;
    }
     
    public void onPostExecute(ArrayList<String> data)
    {
        // ici on a le droit de toucher à "info"
        if (this.error = null) 
            MainActivity.this.onDataResult(data);
        } else {
            Toast.makeText(MainActivity.this,"Error: "+this.error.getLocalizedMessage(), 0).show(); 
        }    
    }
    Et dans l'activité:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public void onDataResult(ArrayList<String> data)
    {
        this.info = data;
        // affichage des données VERIFIER QUE INFO N'EST PAS VIDE 
    }
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 43
    Points : 29
    Points
    29
    Par défaut
    Oui effectivement ça va mieux comme cela. Lorsque ma tablette n'est pas connectée à internet, l'application ne s'arrête pas comme elle le fessait avant .

    Ce code fonctionne bien pour le Wifi, mais pour le 3G, dois-je modifié quelque chose dans mon application? (ajouter permission, gérer la connexion avec le 3G..)

  6. #6
    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
    Absolument rien...

    L'accès Internet a sa propre permission... une fois acquise, le mode d'accès à Internet ne rentre pas en ligne de compte (WiFi, 4G, 3G, Edge, ...).
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 43
    Points : 29
    Points
    29
    Par défaut
    D'accord je te remercie . Résolu

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/04/2015, 18h24
  2. J'ai une itération de plus sans raison
    Par Invité dans le forum Langage
    Réponses: 3
    Dernier message: 28/12/2011, 06h53
  3. Programme qui fonctionne puis qui ne fonctionne plus ..
    Par doudou2152 dans le forum Code::Blocks
    Réponses: 1
    Dernier message: 13/05/2010, 13h14
  4. [carte graphique] ne fonctionne plus sans raison
    Par Matth_S dans le forum Composants
    Réponses: 5
    Dernier message: 16/07/2008, 14h02
  5. Sauvegarde ne s'exécute plus sans raison visible
    Par tibal dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 19/03/2008, 12h48

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