2012-05-08 1 views
-2

Что я пытаюсь сделать, это получить XML-файл Geonames, содержащий соседние статьи в Википедии, на основе моего местоположения и отображения GPS Ссылки на статьи на моей карте или в прядильщик или что-то еще.Как получить и разобрать Geonames XML с помощью AsyncTask/Android

Этот код работает прекрасно в не-андроида приложения:

private double lat = 44; //in my app, this would be the actual coordinates 
private double lng = 9; 

try{ 
     DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); 
     DocumentBuilder builder= factory.newDocumentBuilder(); 

     URL url = new URL("http://api.geonames.org/findNearbyWikipedia?lat="+lat+"&lng="+lng+"&username=my_username"); 
     InputStream stream = url.openStream(); 
     Document xmlDocument = builder.parse(stream); 


     NodeList titleNodes= xmlDocument.getElementsByTagName("title"); 
     NodeList articleURLNodes= xmlDocument.getElementsByTagName("wikipediaUrl"); 
     for(int i=0; i<titleNodes.getLength(); i++){ 


     System.out.println("Artikel "+ (i+1)+": "+ titleNodes.item(i).getTextContent() + " " + articleURLNodes.item(i).getTextContent()); 
     } 
     }catch(Exception ex){ 
     System.out.println(ex.getMessage()); 
     } 

} 

Он печатает все статьи + URLs.

Теперь, когда я использую android, мне нужно использовать AsyncTaks, иначе я получаю исключение NetworkOnMainThread .. до сих пор я действительно не понимал, как они работают и как я могу их использовать.

Это моя попытка:

private class DownloadXMLTask extends AsyncTask<String, Void, InputStream> { 

    String wikiUrl; 
    URL url; 
    InputStream stream; 


    protected InputStream doInBackground(String... urls) { 

     try { 

      wikiUrl=urls[0]; 
      url = new URL(wikiUrl); 
      InputStream stream = url.openStream(); 

     }catch(Exception ex){ 
      System.out.println(ex.getMessage()); 
      } 
     return stream; 

    } 

Я хочу, чтобы передать URL и получить InputStream взамен сделать синтаксический анализ, как показано выше.

Но как получить результат AsyncTask?

P.S. Вот мое решение:

private class DownloadXMLTask extends AsyncTask<String, Void, List<NodeList>> { 

    String wikiUrl; 
    URL url; 
    InputStream stream; 
    DocumentBuilderFactory factory= DocumentBuilderFactory.newInstance(); 
    DocumentBuilder builder; 
    List<NodeList> liste = new ArrayList<NodeList>(); 

    protected List<NodeList> doInBackground(String... urls) { 

     try { 

      wikiUrl=urls[0]; 
      url = new URL(wikiUrl); 
      InputStream stream = url.openStream(); 
      builder = factory.newDocumentBuilder(); 
      Document xmlDocument = builder.parse(stream); 

      NodeList titleNodes=  xmlDocument.getElementsByTagName("title"); 
      NodeList articleURLNodes= xmlDocument.getElementsByTagName("wikipediaUrl"); 

      liste.add(titleNodes); 
      liste.add(articleURLNodes); 

      return liste; 
     }catch(Exception ex){ 
      System.out.println(ex.getMessage()); 
      } 
     return null; 


    } 
} 

Я возвращает список, к которому я приложил нодлист, что мне нужно для дальнейшей обработки.

В моей деятельности я могу получить доступ к ним, как это:

List<NodeList> liste = new DownloadXMLTask().execute(wikiAdresse).get(); 
NodeList titel = liste.get(0); 
NodeList articleURL = liste.get(1); 

// just a quick toast to show it works! =) 
Toast.makeText(this, titel.item(0).getTextContent()+" "+articleURL.item(0).getTextContent(), Toast.LENGTH_LONG).show(); 

ответ

0

Вот учебник для AsyncTask http://droidapp.co.uk/?p=177

А вот один для разбора RSS, но любой XML как ваш код будет следовать этим же с поправки http://droidapp.co.uk/?p=166

+0

спасибо, я попытался уточнить свою проблему/вопрос немного больше – grotsnik

+0

Вы пробовали поместить весь свой первый блок кода в doInBackgroun д? Я бы также посоветовал отобразить диалог прогресса (начиная с onPreExecute и отклоняясь в onPostExecute) – Tony

+0

просто попробовал, никаких ошибок до сих пор, но ничего не происходит. как я могу получить доступ к NodeLists titleNodes и articleURLNodes из моего класса активности после того, как я выполнил DownloadXMLTask? – grotsnik