2013-03-15 2 views
0

Android에서 XML RSS 피드를 단계적으로 수행하기 위해 DOM4j를 사용하려고합니다. lib4에 dom4j.jar을 추가하고 사용자 권한을 부여합니다.DOM4j가 Android에서 작동하지 않습니다.

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

이 소스 코드를 순수 Java 프로젝트로 컴파일하면 작동합니다! Android에 제한 사항이있는 경우 혼란 스럽습니다 (사용 가능한 경우 어떤 방법을 사용할 수 있습니까). 아니면 실수를 한 것입니다. 로그 캣의

부품 : 여기

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 스레드에서. 그것은 안드로이드 4.0.x 이후 no-no입니다. 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

+0

메인 UI 스레드에서 네트워크 작업을 호출 할 수 있습니다. SAX 파서는 입력 스트림을 파싱 할 때주의해야합니다. 쿼리가 큰 데이터 세트를 반환하면'read()'메소드가 반환 될 수 있지만, 후속 구문 분석은 네트워크에 다시 액세스 할 수 있습니다. DOM 파서는 한 번에 읽고/빌드 할 때이 문제가 발생하지 않지만 더 높은 메모리 요구 사항이 있습니다. – 323go

+0

감사합니다. DOM 파서를 사용하도록 변경하고 작동합니다. – user2174595

관련 문제