0

我正在尝试从 url 获取 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

谢谢

4

5 回答 5

1

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

尝试这个,

new Thread(new Runnable() {

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

        }
    }).start();

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

于 2013-04-19T11:50:57.123 回答
1

您无需直接调用 getXML();,而是在 main 方法中编写此代码段:

    {
            ...
            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;
    }

}
于 2013-04-19T12:12:36.803 回答
0
I think we have a same query here

无法从android中的URL获取xml文件

于 2013-04-19T11:05:53.127 回答
0

具有 4 个以上操作系统版本的 Android 设备不允许从主要活动调用 Web 服务。你有活动的HTTP请求,所以你有“android.os.NetworkOnMainThreadException”

我建议您选择 AsyncTask 解决方案。这是一种运行请求或任何其他后台任务并使用具有最新操作系统版本的设备调用 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
 }
}
于 2013-04-19T12:37:04.780 回答
0

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

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

您必须在 newThread或, 中运行您的请求ASyncTask,以承担 UI 线程的负载。您可以在此处找到有关如何使用多个线程的更多信息

于 2013-04-19T12:16:41.883 回答