Android我无法从url获取xml

时间:2013-04-19 10:57:06

标签: android xml http-get

我正在尝试从网址获取xml,但我在HttpResponse中有一个错误。

URL例如如下:

http://maps.googleapis.com/maps/api/directions/xml?origin=43.364876,-5.8654205&destination=43.545686,-5.664482&sensor=true

我的代码是:

public String getXML (String url){

            String result = null;
            try {
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpGet httpPost = new HttpGet(url);

                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                result = EntityUtils.toString(httpEntity);
            } catch (Exception ex) {
                Toast errorToast =
                        Toast.makeText(getApplicationContext(),
                                "Error reading xml", Toast.LENGTH_LONG);
                errorToast.show();
            }
            return result;
}

我已经在清单中设置了互联网权限。 错误在行中:

HttpResponse httpResponse = httpClient.execute(httpPost);

并显示错误:

android.os.NetworkOnMainThreadException

谢谢

5 个答案:

答案 0 :(得分:1)

您应该创建一个新线程,因为获取数据可能需要很长时间,从而阻止了UI线程。这就是你得到android.os.NetworkOnMainThreadException的原因。

试试这个,

new Thread(new Runnable() {

        @Override
        public void run() {
            // Your code here.

        }
    }).start();

此解决方案的替代方案是使用AsyncTask,它在android中提供。它具有doInBackground方法,该方法在后台线程上运行。

答案 1 :(得分:1)

不是直接调用getXML();,而是在主方法中编写此代码段:

    {
            ...
            String[] params = new String[]{url}; 
            AsyncPostData apd = new AsyncPostData ();
            apd.execute(params);
            ...        
    }

定义您的异步任务,如下所示:

private class AsyncPostData extends AsyncTask<String, Void, Void> {

    @Override
    protected Void doInBackground(String... params) {
        getXML (params[0])
        return null;
    }

}

答案 2 :(得分:0)

I think we have a same query here

cant get xml file from an URL in android

答案 3 :(得分:0)

我将从今天早些时候提出的另一个问题中重新发布这个问题:

您正尝试在主UI线程上运行网络请求。自3.0以来,Android不允许你这样做(我相信)。这样做会导致UI锁定,直到请求完成,在请求执行期间使您的应用程序无效。

您必须在新的ThreadASyncTask中运行您的请求,才能加载UI线程。您可以找到有关如何使用多个线程here.

的更多信息

答案 4 :(得分:0)

具有4+ OS版本的Android设备不允许从主要活动调用webservices。 你有活动的HTTP请求,所以你有“android.os.NetworkOnMainThreadException”

我建议您选择AsyncTask解决方案。这是一种简单直接的运行请求或任何其他后台任务的方法,并使用具有最新OS virsion的设备调用Web服务,您必须使用AsyncTask。

它也很容易实现,例如onProgressUpdate如果您需要在运行请求时显示某种进度条。

private class YourTask extends AsyncTask<URL, Integer, Long> {
 protected Long doInBackground(URL... urls) {
    //call your methods from here
         //publish yor progress here..
        publishProgress((int) ((i / (float) count) * 100));
 }

 protected void onProgressUpdate(Integer... progress) {
     setProgressPercent(progress[0]);
 }

 protected void onPostExecute(Long result) {
    //action after execution success or not
 }
}