0

DOM4j を使用して、Android で XML RSS フィードを段階的に処理しようとしています。dom4j.jar を lib\ に追加し、ユーザー権限を追加します。

<uses-permission android:name="android.permission.INTERNET"/>

また、このソース コードをピュア Java プロジェクトでコンパイルしたところ、動作しました。Androidに制限があるかどうか(はいの場合、どの方法を使用できますか)、またはいくつかの間違いを犯しただけで混乱しています。

Logcat のパーツ:

03-15 23:27:10.611: W/System.err(10453): org.dom4j.DocumentException: Couldn't open http://tw.news.yahoo.com/rss/ Nested exception: Couldn't open http://tw.news.yahoo.com/rss/
03-15 23:27:10.621: W/System.err(10453):    at org.dom4j.io.SAXReader.read(SAXReader.java:484)
03-15 23:27:10.621: W/System.err(10453):    at org.dom4j.io.SAXReader.read(SAXReader.java:291)
03-15 23:27:10.621: W/System.err(10453):    at tw.danny.rss_dom4j.RSSDom4jMainActivity.onCreate(RSSDom4jMainActivity.java:28)
03-15 23:27:10.621: W/System.err(10453):    at android.app.Activity.performCreate(Activity.java:5206)
03-15 23:27:10.626: W/System.err(10453):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
03-15 23:27:10.626: W/System.err(10453):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074)
...

メイン アクティビティの onCreate 関数は次のとおりです。

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_rssdom4j_main);

    try {
        URL url = new URL("http://tw.news.yahoo.com/rss/");
        SAXReader saxReader = new SAXReader();
        //?
        Document document = saxReader.read(url);
        Element channel = (Element) document.getRootElement().element(
                "channel");
        for (Iterator i = channel.elementIterator("item"); i.hasNext();) {
            Element element = (Element) i.next();
            System.out.println("title: " + element.elementText("title"));

            String descrip_original = element.elementText("description");
            if (descrip_original.startsWith("<p>")) {
                // address html-like layout
                System.out.println(descrip_original.substring(
                        descrip_original.indexOf("</a>") + 4,
                        descrip_original.length() - 1));

            }

            System.out.println("link: " + element.elementText("link"));
            System.out
                    .println("pubDate: " + element.elementText("pubDate"));

            System.out.println();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

次の行で問題が発生する可能性があります。

SAXReader saxReader = new SAXReader();
4

1 に答える 1

0

メイン UI スレッドでインターネットにアクセスしています。これは、Android 4.0.x 以降では禁止されています。ネットワークにアクセスするコードを AsyncTask に配置するか、新しいスレッドをスピンアップします。

new Thread( new Runnable() {
    @Override
    public void run() {
        try {
            URL url = new URL("http://tw.news.yahoo.com/rss/");
            SAXReader saxReader = new SAXReader();

            Document document = saxReader.read(url);
            Element channel = (Element) document.getRootElement().element(
                    "channel");
            for (Iterator i = channel.elementIterator("item"); i.hasNext();) {
                Element element = (Element) i.next();
                System.out.println("title: " + element.elementText("title"));

                String descrip_original = element.elementText("description");
                if (descrip_original.startsWith("<p>")) {
                    // address html-like layout
                    System.out.println(descrip_original.substring(
                            descrip_original.indexOf("</a>") + 4,
                            descrip_original.length() - 1));

                }

                System.out.println("link: " + element.elementText("link"));
                System.out
                        .println("pubDate: " + element.elementText("pubDate"));

                System.out.println();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
} ).start();
于 2013-03-15T16:10:24.943 に答える