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)