0

オンラインにある XML ファイルを解析するアプリケーション Android を作成しました。私は JDOM と AsyncTask を使用しています。これはうまく機能しますが、WIFI に接続している場合に限られます。

3Gで接続したら使えなくなりました。「原因: java.net.UnknownHostException: ホスト "jeancdc.perso.sfr.fr" を解決できません: ホスト名に関連付けられたアドレスがありません」というメッセージが表示されます。

これはログ ファイルです: log .

私の Manifest.xml ファイルに、アクセス許可を追加しました。

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

誰か助けてくれませんか?事前に感謝します。

以下は私の XMLReader クラスで、その後に私の MainActivity クラスが続きます。

package fr.jcdc.exemple.jdomasynctaskxmlreader;

import java.io.IOException;
import java.net.URL;
import java.util.List;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;

import android.util.Log;

public class XMLReader {

    private Personnage[] personnages;

    public XMLReader() {
        super();
    }

    public void loading() {

        Log.i("tag","fonction loading.");

        try {

            SAXBuilder builder = new SAXBuilder();

            Document document = (Document) builder.build(new URL("http://jeancdc.perso.sfr.fr/fichierXML.xml"));

            Element rootNode = document.getRootElement();
            List<Element> charactersList = rootNode.getChildren("personnage");

            personnages = new Personnage[charactersList.size()];

            for (int i = 0; i < charactersList.size(); i++) {

               Element node = (Element) charactersList.get(i);

               personnages[i] = new Personnage();
               personnages[i].setPrenom(node.getChildText("prenom"));
               personnages[i].setNom(node.getChildText("nom"));
               personnages[i].setFonction(node.getChildText("fonction"));

               Log.i("tag", node.getChildText("prenom") + " " + node.getChildText("nom"));      
            }

        }
        catch (IOException ioex) {
            Log.d("ioex", ioex.getMessage());
            ioex.printStackTrace();
        }
        catch (JDOMException jdomex) {
            Log.d("jdomex", jdomex.getMessage());
        }

    }



    public Personnage[] getPersonnages() {
        return personnages;
    }


}


// Rajouter dans le fichier AndroidManifest.xml :
// - android:configChanges="orientation|screenSize" pour gérer le changement d'orientation
// et ainsi éviter le crash de l'application
// - la permission ACCESS_NETWORK_STATE

package fr.jcdc.exemple.jdomasynctaskxmlreader;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Context;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

public class MainActivity extends ListActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();

        if (activeNetwork != null && activeNetwork.isConnected()) {

            new GetXMLDataTask<Object>().execute();
        }
        else {

            AlertDialogBuilder alertDialogBuilder = new AlertDialogBuilder(this);
            alertDialogBuilder.setTitle("Pas de connexion");
            alertDialogBuilder.setMessage("Veuillez vérifier votre connexion à Internet.");
            AlertDialog alertDialog = alertDialogBuilder.create();
            alertDialog.show();
        }

    }





    private class GetXMLDataTask<XMLItem> extends AsyncTask<String, Void, List<XMLItem>> {

            private XMLReader xmlReader = new XMLReader();
            private ProgressDialog progressDialog;


            @Override
            protected void onPreExecute() {
                super.onPreExecute();

                progressDialog = new ProgressDialog(MainActivity.this);
                progressDialog.setTitle("Téléchargement des données");
                progressDialog.setMessage("Veuillez patienter.");
                progressDialog.show();
            }


            @Override
            protected List<XMLItem> doInBackground(String... arg0) {

                xmlReader.loading();

                return null;
            }


            @Override
            protected void onPostExecute(List<XMLItem> result) {

                try {

                    List<HashMap<String, String>> liste = new ArrayList<HashMap<String, String>>();

                    HashMap<String, String> hashMap;

                    for (int i = 0 ; i < xmlReader.getPersonnages().length ; i++) {
                        hashMap = new HashMap<String, String>();
                        hashMap.put("nom", xmlReader.getPersonnages()[i].getPrenom() + " " + xmlReader.getPersonnages()[i].getNom());
                        hashMap.put("fonction", xmlReader.getPersonnages()[i].getFonction());
                        liste.add(hashMap);
                    }

                    SimpleAdapter adapter = new SimpleAdapter(getApplication(), liste,
                            R.layout.liste_personnages, new String[] {"nom", "fonction"},
                            new int[] {R.id.tv_prenom_nom, R.id.tv_fonction});

                    ListView listView = (ListView) findViewById(android.R.id.list);

                    listView.setAdapter(adapter);

                }
                catch(NullPointerException e) {
                    e.printStackTrace();
                }

                if (progressDialog.isShowing()) {
                    progressDialog.dismiss();
                }

            }

        }


        @Override
        protected void onListItemClick(ListView l, View v, int position, long id) {
            super.onListItemClick(l, v, position, id);

            @SuppressWarnings("unchecked")
            HashMap<String,String> hmPersonnage = (HashMap<String,String>) l.getItemAtPosition(position);

            Toast.makeText(this.getApplication(), hmPersonnage.get("nom"), Toast.LENGTH_SHORT).show();
        }


    }
4

1 に答える 1