解析Android应用程序中的XML文件时出现UnknownHostException

时间:2013-07-29 11:22:14

标签: android parsing permissions android-asynctask host

我写了一个应用程序Android来解析一个位于网上的XML文件。我使用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();
        }


    }

1 个答案:

答案 0 :(得分:0)

“java.net.UnknownHostException:无法解析主机”当您不提供访问互联网权限但是您添加了所需的权限,然后您的主机服务器由于互联网速度而导致您的主机服务器没有及时响应时,总会发生异常互联网速度可能会发生此异常。