Java 使用XmlPullParserFactory分析XML在while语句中崩溃

Java 使用XmlPullParserFactory分析XML在while语句中崩溃,java,android,xml,inputstream,xmlpullparser,Java,Android,Xml,Inputstream,Xmlpullparser,我使用XmlPullParserFactory对象来解析从服务器接收到的一些XML。出于某种原因,它在while语句处崩溃,我不明白为什么会发生这种情况 XML: 你知道为什么会发生坠机吗?我是否应该指定roote节点的名称?根据堆栈跟踪,问题似乎不是while循环 09-03 16:31:50.108: W/System.err(16727): java.io.IOException: Stream is closed 09-03 16:31:50.108: W/System.err(1672

我使用
XmlPullParserFactory
对象来解析从服务器接收到的一些
XML
。出于某种原因,它在
while
语句处崩溃,我不明白为什么会发生这种情况

XML:


你知道为什么会发生坠机吗?我是否应该指定roote节点的名称?

根据堆栈跟踪,问题似乎不是while循环

09-03 16:31:50.108: W/System.err(16727): java.io.IOException: Stream is closed
09-03 16:31:50.108: W/System.err(16727):    at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:158)
09-03 16:31:50.108: W/System.err(16727):    at libcore.io.Streams.readSingleByte(Streams.java:41)
09-03 16:31:50.108: W/System.err(16727):    at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:128)
09-03 16:31:50.108: W/System.err(16727):    at org.kxml2.io.KXmlParser.setInput(KXmlParser.java:1623)
它在代码中的setInput()处抛出一个异常,在while循环之前


根本原因可能有很多。我先看看downloadUrl()代码,看看它返回的流是否已经关闭。

和堆栈跟踪/异常是什么?抱歉,刚刚添加了这些。看起来你是对的。我正在关闭downloadUrl()函数中的流。谢谢
class PUCNewsItem
{

    public String title;
    public String summary;
    public String body;
    public String url;
    public String imageUrl;

}

public class PUCDatasource extends Activity {

    public static ArrayList<PUCNewsItem> getPUCNews() throws IOException {

            String url = "http://api.mysite.com/list";
            InputStream is = downloadUrl(url);
            XmlPullParserFactory pullParserFactory;

            try {
                pullParserFactory = XmlPullParserFactory.newInstance();
                XmlPullParser parser = pullParserFactory.newPullParser();
                parser.setInput(is, null);

                ArrayList<PUCNewsItem> items = null;
                int eventType = parser.getEventType();
                PUCNewsItem item = null;
                Log.d("Debug: ", "Start");
                while (eventType != XmlPullParser.END_DOCUMENT){
                    String name = null;
                    switch (eventType){
                        case XmlPullParser.START_DOCUMENT:
                            Log.d("Debug: ", "Start doc");
                            items = new ArrayList<PUCNewsItem>();
                            break;
                        case XmlPullParser.START_TAG:
                            name = parser.getName();
                            if (name == "item"){
                                item = new PUCNewsItem();
                            } else if (item != null){
                                if (name == "title"){
                                    item.title = parser.nextText();
                                } else if (name == "summary"){
                                    item.summary = parser.nextText();
                                } else if (name == "body_text"){
                                    item.body = parser.nextText();
                                }  
                            }
                            break;
                        case XmlPullParser.END_TAG:
                            name = parser.getName();
                            if (name.equalsIgnoreCase("item") && item != null) {
                                items.add(item);
                            }
                            break;
                    }//end switch

                    eventType = parser.next();

                }//end while

                return items;

            } catch (XmlPullParserException e) {
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            return null;

        }//end

}//end class
09-03 16:31:50.100: W/System.err(16727): Invalid stream or encoding: java.io.IOException: Stream is closed (position:START_DOCUMENT null@1:1) caused by: java.io.IOException: Stream is closed; nested exception is:
09-03 16:31:50.108: W/System.err(16727): java.io.IOException: Stream is closed
09-03 16:31:50.108: W/System.err(16727):    at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:158)
09-03 16:31:50.108: W/System.err(16727):    at libcore.io.Streams.readSingleByte(Streams.java:41)
09-03 16:31:50.108: W/System.err(16727):    at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:128)
09-03 16:31:50.108: W/System.err(16727):    at org.kxml2.io.KXmlParser.setInput(KXmlParser.java:1623)
09-03 16:31:50.108: W/System.err(16727):    at com.puc.mobile.PUCDatasource.getPUCNews(PUCDatasource.java:40)
09-03 16:31:50.108: W/System.err(16727):    at com.puc.mobile.MainActivity$DownloadPUCNews.doInBackground(MainActivity.java:94)
09-03 16:31:50.108: W/System.err(16727):    at com.puc.mobile.MainActivity$DownloadPUCNews.doInBackground(MainActivity.java:1)
09-03 16:31:50.108: W/System.err(16727):    at android.os.AsyncTask$2.call(AsyncTask.java:264)
09-03 16:31:50.108: W/System.err(16727):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
09-03 16:31:50.108: W/System.err(16727):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
09-03 16:31:50.108: W/System.err(16727):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
09-03 16:31:50.108: W/System.err(16727):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
09-03 16:31:50.108: W/System.err(16727):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
09-03 16:31:50.108: W/System.err(16727):    at java.lang.Thread.run(Thread.java:856)
09-03 16:31:50.108: D/AndroidRuntime(16727): Shutting down VM
09-03 16:31:50.108: W/dalvikvm(16727): threadid=1: thread exiting with uncaught exception (group=0x40aba210)
09-03 16:31:50.108: E/AndroidRuntime(16727): FATAL EXCEPTION: main
09-03 16:31:50.108: E/AndroidRuntime(16727): java.lang.NullPointerException
09-03 16:31:50.108: E/AndroidRuntime(16727):    at com.puc.mobile.MainActivity$DownloadPUCNews.onPostExecute(MainActivity.java:103)
09-03 16:31:50.108: E/AndroidRuntime(16727):    at com.puc.mobile.MainActivity$DownloadPUCNews.onPostExecute(MainActivity.java:1)
09-03 16:31:50.108: E/AndroidRuntime(16727):    at android.os.AsyncTask.finish(AsyncTask.java:602)
09-03 16:31:50.108: E/AndroidRuntime(16727):    at android.os.AsyncTask.access$600(AsyncTask.java:156)
09-03 16:31:50.108: E/AndroidRuntime(16727):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615)
09-03 16:31:50.108: E/AndroidRuntime(16727):    at android.os.Handler.dispatchMessage(Handler.java:99)
09-03 16:31:50.108: E/AndroidRuntime(16727):    at android.os.Looper.loop(Looper.java:137)
09-03 16:31:50.108: E/AndroidRuntime(16727):    at android.app.ActivityThread.main(ActivityThread.java:4697)
09-03 16:31:50.108: E/AndroidRuntime(16727):    at java.lang.reflect.Method.invokeNative(Native Method)
09-03 16:31:50.108: E/AndroidRuntime(16727):    at java.lang.reflect.Method.invoke(Method.java:511)
09-03 16:31:50.108: E/AndroidRuntime(16727):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
09-03 16:31:50.108: E/AndroidRuntime(16727):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
09-03 16:31:50.108: E/AndroidRuntime(16727):    at dalvik.system.NativeStart.main(Native Method)
09-03 16:31:50.108: W/System.err(16727): java.io.IOException: Stream is closed
09-03 16:31:50.108: W/System.err(16727):    at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:158)
09-03 16:31:50.108: W/System.err(16727):    at libcore.io.Streams.readSingleByte(Streams.java:41)
09-03 16:31:50.108: W/System.err(16727):    at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:128)
09-03 16:31:50.108: W/System.err(16727):    at org.kxml2.io.KXmlParser.setInput(KXmlParser.java:1623)