2012-07-29 35 views
2

我试图使用this IBM example中使用的XmlPullParser制作Manga Rss-Reader应用程序。我采用了IBM源代码,并且只将feedURL更改为“http://fandom.com/rss/new/manga”,而所有文件中的PUB_DATE字符串已更改为PUBDATE。我仍然不能让应用程序正常运行。Xml解析到android ListView使用IBM示例

仅供参考我已经将源代码Otaku重新命名为我计划将其用作新应用程序的基础。它应该显示这个RSS饲料作为一个ListView,但我不明白问题在哪里。我碰巧logcat的文盲:( 我的日志猫态:

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

这是从你的logcat最重要的一点:

Caused by: android.os.NetworkOnMainThreadException 

那就是告诉你,你正试图使您的网络请求从主线程获取RSS提要

从Honeycomb(IIRC)开始,在主线程上执行网络请求将引发异常,因为平台创建者想要提醒您网络操作不应该发生日主线程。

quickets修复这个问题的方法是构建一个更低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 postGREAT资源学习两个线程/处理器和的AsyncTask时使用。

+0

感谢您的快速回复。现在我知道在logcat中寻找什么xD。不久,当我拿回我的开发笔记本电脑时,我会试试这个。再次感谢:D – Davidrd91 2012-07-30 05:27:25

+0

已经接受答案,但我想强调的是,较低层建筑的“快速修复”非常脏,不建议使用。在这种情况下,AsyncTask是最好的解决方案。干杯 – Ewoks 2012-10-08 10:21:36