我在非UI线程中有一个简单的XmlPullParser
,它通过HTTP解析XML中的一些数据并将其存储在本地MySQL数据库中。第一次,解析操作很漂亮,所有数据都应该到达应有的位置。但是,如果我再次启动解析操作(假设活动尚未被销毁并在此期间重新创建),则不会失败。它不会引发任何例外;相反,它就像它已经在文件的末尾,只是完成而没有找到任何标签。然后,如果我第三次运行它,它再次正常工作,循环重复。
是否有一个方法我应该调用以在解析器完成时正确关闭它?我浏览了文档和示例,但找不到任何相关内容。
以下是相关代码的简化版本:
parseThread = new Thread () {
public void run() {
mDB.delete(directoryPeople.TEMP_TABLE, null, null);
XmlPullParserFactory parserCreator = XmlPullParserFactory.newInstance();
XmlPullParser parser = parserCreator.newPullParser();
URL feed = new URL(directoryUrl);
parser.setInput(feed.openStream(), null);
ContentValues entry = new ContentValues();
int parserEvent = parser.getEventType();
String tag = "";
String value = "";
entryCount = 0;
while (parserEvent != XmlPullParser.END_DOCUMENT) {
if(parserEvent == XmlPullParser.START_TAG) {
tag = parser.getName();
if (isPeopleField(tag)) {
parserEvent = parser.next();
value = parser.getText();
entry.put(tag, value.replaceAll("\n", ""));
}
}
if(parserEvent == XmlPullParser.END_TAG && parser.getName().compareTo("ROW") == 0) {
mDB.insert(directoryPeople.TEMP_TABLE, null, entry);
entryCount++;
hUpdateProgressBar.sendEmptyMessage(0);
entry.clear();
}
parserEvent = parser.next();
}
/** Copy temp table to permanent table */
mDB.delete(directoryPeople.PEOPLE_TABLE, null, null);
String copyQuery = "INSERT INTO " + directoryPeople.PEOPLE_TABLE
+ " SELECT * FROM " + directoryPeople.TEMP_TABLE;
mDB.execSQL(copyQuery);
/** Delete contents of temp table */
mDB.delete(directoryPeople.TEMP_TABLE, null, null);
mHandler.post(new Runnable() {
public void run() {
adapter.getCursor().requery();
}
});
}
};
parseThread.start();