-2

我想做的是根据我的 GPS 位置获取包含附近维基百科文章的 Geonames XML 文件,并在我的地图或微调器或其他任何东西上显示文章的链接。

此代码在非 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());
        }

}

它打印所有文章+网址。

现在,当我使用 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 的结果呢?

PS这是我的解决方案:

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;


     }
 }

我返回了一个附有 NodeLists 的列表,我需要进一步处理。

在我的活动中,我可以像这样访问它们:

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(); 
4

1 回答 1

0

这是 AsyncTask 的教程 http://droidapp.co.uk/?p=177

这是解析 RSS 的一个,但任何像你的代码这样的 XML 都将遵循相同的修改 http://droidapp.co.uk/?p=166

于 2012-05-08T17:08:38.173 回答