好吧,循环体是有了,但没见着一个reader.read(),阻塞读在哪里?还有输入流在哪里?
注意到上面初始化方法中最后resetParser():
private void resetParser() {
try {
parser = XmlPullParserFactory.newInstance().newPullParser();
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
parser.setInput(connection.reader);
}
catch (XmlPullParserException xppe) {
xppe.printStackTrace();
}
}
?这里把输入流connection.reader交给了parser。看来只能从parser中查找,XmlPullParserFactory中
public XmlPullParser newPullParser() throws XmlPullParserException {
final XmlPullParser pp = new KXmlParser();
for (Map.Entry<String, Boolean> entry : features.entrySet()) {
pp.setFeature(entry.getKey(), entry.getValue());
}
return pp;
}
?parser来自于org.kxml2.io.KXmlParser,继续下kxml2源码包找,真够折腾的
public void setInput(Reader reader) throws XmlPullParserException {
this.reader = reader;
//...
if (reader == null)
return;
//...
}
?可见socket输入流交给了parser,顺便看下parsePackets方法中用到的parser.next()等方法,都调用了peek()方法:
/** Does never read more than needed */
private final int peek(int pos) throws IOException {
while (pos >= peekCount) {
int nw;
if (srcBuf.length <= 1)
nw = reader.read();
else if (srcPos < srcCount)
nw = srcBuf[srcPos++];
else {
srcCount = reader.read(srcBuf, 0, srcBuf.length);
if (srcCount <= 0)
nw = -1;
else
nw = srcBuf[0];
srcPos = 1;
}
if (nw == ‘\r‘) {
wasCR = true;
peek[peekCount++] = ‘\n‘;
}
else {
if (nw == ‘\n‘) {
if (!wasCR)
peek[peekCount++] = ‘\n‘;
}
else
peek[peekCount++] = nw;
wasCR = false;
}
}
return peek[pos];
}
?这里终于出现了reader.read(),就在这里阻塞读。这是一个多么苦逼的过程。为了xml解析不得不把一行代码化为数百行代码,而且这样很费电的你知道吗^_^。