XmlPullParser中的android.os.NetworkOnMainThreadException

时间:2015-08-05 14:00:58

标签: java android google-places-api android-xmlpullparser

我使用google places api返回附近有趣的地方列表。每个位置及其属性都包含在result和/ result标记中。 遇到第一个/结果标记后,只要有parser.next()语句,我就会在主线程异常上获得网络。

      try {
        int type = parser.getEventType();
         Locations obj = null;

        while (type != XmlPullParser.END_DOCUMENT) {

            String name = parser.getName();
            switch (type) {
                case XmlPullParser.START_TAG: {
                    if (name.equalsIgnoreCase("result"))
                    {obj = new Locations();}

                    else if (name.equalsIgnoreCase("name"))
                        obj.name = parser.nextText();

                    else if (name.equalsIgnoreCase("vicinity"))
                        obj.address = parser.nextText();
                    else if (name.equalsIgnoreCase("lat"))
                        lat = parser.nextText();
                    else if (name.equalsIgnoreCase("lng")) {
                        lng = parser.nextText();
                    LatLng latLng = new LatLng(Double.parseDouble(lat),Double.parseDouble(lng));
                        obj.latlng = latLng;
                    }
                    break;
                }

                case XmlPullParser.END_TAG: {
                    if (name.equalsIgnoreCase("result")) {
                        entries.add(obj);
                    }
                    break;
                }
            }//End Switch Case
            type = parser.next();

            }//End While Block



        } //End try block

      catch (IOException ioex)
      {
        ioex.printStackTrace();
      }
      catch (XmlPullParserException ioex)
      {
        ioex.printStackTrace();
      }
      catch (Exception ioex)
      {
        ioex.printStackTrace();
      }

Locations类的每个对象代表一个地方。 我使用了一个单独的线程来执行httpurl连接活动,并且还将读取超时设置为3分钟。 (下面的类用于打开http网络连接)

    public class DownloadxmlTask  {

    public String status=null;
    public InputStream isi=null;
    private InputStream loadXmlfromnetwork(String url) {
    InputStream in = null;
    try {
        URL urlobj = new URL(url);
        HttpURLConnection conobj = (HttpURLConnection) urlobj.openConnection();
        conobj.setReadTimeout(3*60000);
        in = conobj.getInputStream();
        isi=in;
        status = in.toString();
        wait(3*60000);
        conobj.disconnect();
     } catch (Exception ex) {
        status =ex.getLocalizedMessage().toString();
      }
      return in;
      }
     protected InputStream doInBackground(String params) {

        final String url = params;

    Thread newthread=new Thread() {
        @Override
        public void run() {
            loadXmlfromnetwork(url);
        }
            };
        newthread.start();
      return isi;
      }
     } 

1 个答案:

答案 0 :(得分:0)

错误是不言自明的。您需要在UI主线程的单独线程内执行解析器调用。虽然有各种技术可以实现这一点,但最简单的方法是创建一个AsyncTask。

我已经粘贴了最简单的AsyncTask实现版本。 doInBackground()方法在其自己的单独线程上运行,而onPostExecute()在UI主线程上执行。

将所有解析器逻辑放在doInBackground()方法中。

private final AsyncTask<Void, Void, Void> cacheInitializationTask = new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... params) {

            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            //Runs on UI thread
            super.onPostExecute(aVoid);
        }
    };

有关更多信息,请访问此链接 AsyncTask