2015-08-05 1 views
-2

Я использую google places api, чтобы вернуть список интересных мест поблизости. Каждое место и его атрибуты заключены в тег результата и/result. После обнаружения первого/результата тега я получаю Network при исключении основного потока всякий раз, когда существует инструкция parser.next().android.os.NetworkOnMainThreadException в XmlPullParser

 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; 
     } 
    } 
+0

что делает 'Locations' делать? – tyczj

+0

Я не получаю эту ошибку, если я использую другой запрос xml. – Bharaneedharan

+0

@tyczj. Я мог ясно видеть, что класс Locations может быть классом POJO. Пожалуйста, изучите вопрос и помогите новичкам форума. –

ответ

0

Ошибка объяснения. Вы должны выполнить свой синтаксический разбор в отдельном потоке из основного потока пользовательского интерфейса. Хотя для достижения этой цели существует различная техника, самым простым является создание AsyncTask.

Я вставил простейшую версию реализации AsyncTask. Метод doInBackground() выполняется в отдельном потоке, а onPostExecute() выполняется в главном потоке пользовательского интерфейса.

Разместите всю логику анализатора внутри 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