2013-03-15 6 views
0

Я пытаюсь использовать DOM4j для фазирования XML-канала RSS на Android. Я добавляю 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

Вы получаете доступ к Интернету на основной поток пользовательского интерфейса. Это не так, как 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

Большое спасибо, это работает :) У меня есть другой вопрос. Почему я не могу написать phasher в другом классе .java и вызвать метод, подобный RSSPhasher.parse() в потоке? – user2174595

+0

Вы можете, если вы вызываете какие-либо сетевые операции с основного потока пользовательского интерфейса. Вы должны быть осторожны с синтаксическими анализаторами SAX, поскольку они анализируют входной поток. Если ваш запрос возвращает большой набор данных, метод 'read()' может возвращаться, но последующий синтаксический анализ может снова обратиться к сети. У DOM-парсеров не было бы этой проблемы, поскольку они читали/строили за один присест, но, конечно, у вас там более высокие требования к памяти. – 323go

+0

Спасибо вам ответ. Я использую DOM-парсер, и он работает. – user2174595