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

}

すべての記事と URL を出力します。

今、私はアンドロイドを使用しているので、AsyncTaks を使用する必要があります。そうしないと、NetworkOnMainThread Exception が発生します。

これは私の試みです:

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 に答える