【问题标题】:Android I can't get xml from urlAndroid 我无法从 url 获取 xml
【发布时间】:2013-04-19 10:57:06
【问题描述】:

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

网址例如如下:

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

谢谢

【问题讨论】:

  • 你能发布错误吗?
  • 试试这个:HttpPost httpPost = new HttpPost(url);

标签: android xml http-get


【解决方案1】:

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

试试这个,

new Thread(new Runnable() {

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

        }
    }).start();

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

【讨论】:

    【解决方案2】:

    你不用直接调用getXML();,而是在你的main方法中写下这个sn-p:

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

    【讨论】:

      【解决方案3】:
      I think we have a same query here
      

      cant get xml file from an URL in android

      【讨论】:

        【解决方案4】:

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

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

        您必须在新的ThreadASyncTask 中运行您的请求,以承担 UI 线程的负载。你可以找到更多关于如何使用多线程的信息here.

        【讨论】:

          【解决方案5】:

          具有 4 个以上操作系统版本的 Android 设备不允许从主要活动调用网络服务。 你有活动的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
           }
          }
          

          【讨论】:

            猜你喜欢
            • 2011-08-16
            • 1970-01-01
            • 2017-09-26
            • 1970-01-01
            • 1970-01-01
            • 2017-03-27
            • 1970-01-01
            • 1970-01-01
            • 2014-08-25
            相关资源
            最近更新 更多