Что я пытаюсь сделать, это получить 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();
спасибо, я попытался уточнить свою проблему/вопрос немного больше – grotsnik
Вы пробовали поместить весь свой первый блок кода в doInBackgroun д? Я бы также посоветовал отобразить диалог прогресса (начиная с onPreExecute и отклоняясь в onPostExecute) – Tony
просто попробовал, никаких ошибок до сих пор, но ничего не происходит. как я могу получить доступ к NodeLists titleNodes и articleURLNodes из моего класса активности после того, как я выполнил DownloadXMLTask? – grotsnik