线程中的XmlPullParser每隔一次运行都不返回任何内容。为什么?

时间:2011-03-25 06:58:47

标签: android

我在非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();

0 个答案:

没有答案