0

我编写了一个 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();
        }


    }
4

1 回答 1

0

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

于 2013-07-29T11:49:53.087 回答