2013-03-15 111 views
0

我嘗試使用DOM4j爲Android上的XML RSS源創建階段。我將dom4j.jar添加到lib \和用戶權限。DOM4j在Android上無法正常工作

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

回答

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(); 
+0

非常感謝,它的工作:) 我還有一個問題。爲什麼我不能在另一個.java類中寫入phasher,並在線程中調用像RSSPhasher.parse()這樣的方法? – user2174595 2013-03-16 04:35:57

+0

只要你從主UI線程中調用任何網絡操作,你就可以。在解析輸入流時,您需要小心SAX解析器。如果您的查詢返回大型數據集,則可能會返回'read()'方法,但後續解析可能會再次訪問網絡。 DOM解析器不會有這個問題,因爲它們只是一次讀取/構建,但是當然你需要更高的內存需求。 – 323go 2013-03-16 05:33:01

+0

謝謝你的回答。我改變使用DOM解析器,它的工作原理。 – user2174595 2013-03-22 15:02:09

相關問題