2012-07-29 2 views
2

this IBM example에서 사용 된 XmlPullParser를 사용하여 Manga Rss-Reader 앱을 만들려고합니다. IBM 소스 코드를 가져 와서 "http://fandom.com/rss/new/manga"로만 feedURL을 변경하고 모든 파일의 PUB_DATE 문자열을 PUBDATE로 변경했습니다. 아직도 나는 앱이 제대로 돌아 가지 못하게한다.Xml IBM을 사용한 안드로이드 ListView 구문 분석

오타쿠 소스를 새 앱의 기반으로 사용하기 위해 오타쿠 소스의 이름을 변경했습니다. 이 Rss 피드를 ListView로 표시해야하지만 문제가있는 곳을 이해하지 못합니다. . 내가 문맹 로그 캣 할 일이 :( 내 로그 고양이 상태 :

07-29 13:24:17.963: E/Trace(670): error opening trace file: No such file or directory(2) 
07-29 13:24:18.113: W/ActivityThread(670): Application com.mypacks.activities.otaku is waiting for the debugger on port 8100... 
07-29 13:24:18.133: I/System.out(670): Sending WAIT chunk 
07-29 13:24:18.133: I/dalvikvm(670): Debugger is active 
07-29 13:24:18.333: I/System.out(670): Debugger has connected 
07-29 13:24:18.333: I/System.out(670): waiting for debugger to settle... 
07-29 13:24:18.533: I/System.out(670): waiting for debugger to settle... 
07-29 13:24:18.733: I/System.out(670): waiting for debugger to settle... 
07-29 13:24:18.943: I/System.out(670): waiting for debugger to settle... 
07-29 13:24:19.171: I/System.out(670): waiting for debugger to settle... 
07-29 13:24:19.386: I/System.out(670): waiting for debugger to settle... 
07-29 13:24:19.646: I/System.out(670): waiting for debugger to settle... 
07-29 13:24:19.857: I/System.out(670): waiting for debugger to settle... 
07-29 13:24:20.089: I/System.out(670): debugger has settled (1518) 
07-29 13:24:20.753: I/AndroidNews(670): ParserType=XML_PULL 
07-29 13:24:20.903: E/AndroidNews(670): android.os.NetworkOnMainThreadException 
07-29 13:24:20.903: E/AndroidNews(670): java.lang.RuntimeException: android.os.NetworkOnMainThreadException 
07-29 13:24:20.903: E/AndroidNews(670):  at com.mypacks.internals.otaku.XmlPullFeedParser.parse(XmlPullFeedParser.java:57) 
07-29 13:24:20.903: E/AndroidNews(670):  at com.mypacks.internals.otaku.MessageList.loadFeed(MessageList.java:77) 
07-29 13:24:20.903: E/AndroidNews(670):  at com.mypacks.internals.otaku.MessageList.onCreate(MessageList.java:33) 
07-29 13:24:20.903: E/AndroidNews(670):  at android.app.Activity.performCreate(Activity.java:5008) 
07-29 13:24:20.903: E/AndroidNews(670):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
07-29 13:24:20.903: E/AndroidNews(670):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 
07-29 13:24:20.903: E/AndroidNews(670):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
07-29 13:24:20.903: E/AndroidNews(670):  at android.app.ActivityThread.access$600(ActivityThread.java:130) 
07-29 13:24:20.903: E/AndroidNews(670):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
07-29 13:24:20.903: E/AndroidNews(670):  at android.os.Handler.dispatchMessage(Handler.java:99) 
07-29 13:24:20.903: E/AndroidNews(670):  at android.os.Looper.loop(Looper.java:137) 
07-29 13:24:20.903: E/AndroidNews(670):  at android.app.ActivityThread.main(ActivityThread.java:4745) 
07-29 13:24:20.903: E/AndroidNews(670):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-29 13:24:20.903: E/AndroidNews(670):  at java.lang.reflect.Method.invoke(Method.java:511) 
07-29 13:24:20.903: E/AndroidNews(670):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
07-29 13:24:20.903: E/AndroidNews(670):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
07-29 13:24:20.903: E/AndroidNews(670):  at dalvik.system.NativeStart.main(Native Method) 
07-29 13:24:20.903: E/AndroidNews(670): Caused by: android.os.NetworkOnMainThreadException 
07-29 13:24:20.903: E/AndroidNews(670):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117) 
07-29 13:24:20.903: E/AndroidNews(670):  at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 
07-29 13:24:20.903: E/AndroidNews(670):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 
07-29 13:24:20.903: E/AndroidNews(670):  at java.net.InetAddress.getAllByName(InetAddress.java:214) 
07-29 13:24:20.903: E/AndroidNews(670):  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70) 
07-29 13:24:20.903: E/AndroidNews(670):  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50) 
07-29 13:24:20.903: E/AndroidNews(670):  at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:341) 
07-29 13:24:20.903: E/AndroidNews(670):  at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87) 
07-29 13:24:20.903: E/AndroidNews(670):  at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 
07-29 13:24:20.903: E/AndroidNews(670):  at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:315) 
07-29 13:24:20.903: E/AndroidNews(670):  at libcore.net.http.HttpEngine.connect(HttpEngine.java:310) 
07-29 13:24:20.903: E/AndroidNews(670):  at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289) 
07-29 13:24:20.903: E/AndroidNews(670):  at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239) 
07-29 13:24:20.903: E/AndroidNews(670):  at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273) 
07-29 13:24:20.903: E/AndroidNews(670):  at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168) 
07-29 13:24:20.903: E/AndroidNews(670):  at com.mypacks.internals.otaku.BaseFeedParser.getInputStream(BaseFeedParser.java:36) 
07-29 13:24:20.903: E/AndroidNews(670):  at com.mypacks.internals.otaku.XmlPullFeedParser.parse(XmlPullFeedParser.java:19) 
07-29 13:24:20.903: E/AndroidNews(670):  ... 16 more 
07-29 13:24:21.173: I/Choreographer(670): Skipped 44 frames! The application may be doing too much work on its main thread. 
07-29 13:24:21.223: D/gralloc_goldfish(670): Emulator without GPU emulation detected. 

답변

1

이 당신의 로그 캣에서 중요한 비트 : 네트워크를 만들기 위해 노력하고 있음을 말하고있다

Caused by: android.os.NetworkOnMainThreadException 

메인 스레드에서 RSS 피드를 얻으려는 요청

플랫폼 작성자가 네트워크 작업을 수행해서는 안되기 때문에 메인 스레드에서 net 요청을하는 것은 허니컴 (IIRC)으로 시작됩니다. 일 전자 주 스레드.

"수정"하는 빠른 방법은 API 레벨을 낮추기 위해 애플리케이션을 빌드하는 것입니다.

더 정확한 해결 방법은 네트워크 작업을 자체 백그라운드 스레드로 옮기는 것입니다. 이렇게하는 한 가지 방법은 다음과 같이 당신의 RSSReader 활동에에서 onCreate() 메소드를 변경하는 것입니다 : 당신이 할 수있는

private RSSFeed feed = null; 
private Handler h; 

public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.main); 
    //Set up a Handler to call updateDisplay() once the feed has been fetched. 
    h = new Handler(){ 
     @Override 
     public void handleMessage(Message msg){ 
      // display UI 
      UpdateDisplay(); 
     } 
    }; 


    Thread t = new Thread() { 
     @Override 
     public void run() { 

      // go get our feed! 
      feed = getFeed(RSSFEEDOFCHOICE); 
      //Send a signal to the handler to tell it that we are done fetching the feed. 
      h.sendEmptyMessage(0); 

     } 
    }; 
    t.start(); 

} 

또 다른 방법은 AsyncTask 함께.

This Lars Vogella blog post는 모두 스레드/핸들러와 AsyncTask를 배우는 때 사용할 GREAT 자원이다.

+0

빠른 답장을 보내 주셔서 감사합니다. 이제 logcat에서 xD를 찾으려면 무엇을해야할지 알았습니다. 곧 내 dev- ing 노트북을 다시 사도록하겠습니다. 다시 한 번 감사드립니다 : D – Davidrd91

+0

이미 답변을 받았지만 저층 건물에 대한 "빠른 수정"은 매우 더럽고 추천하지 않습니다. AsyncTask는이 경우 최상의 솔루션입니다. 건배 – Ewoks