1

我正在 Android 中开发一个 RSS 提要解析器,并且我已经实现了一个 SAX 解析器,它在大多数情况下都能完美运行。

但是,我在一些测试提要上遇到了问题。在我解析了指定数量的提要项目后,我抛出了一个 SAXException 来停止解析器,AFAIK 是这样做的正确方法。在大多数提要上,这会停止解析,我的 catch 块(见下文)处理并记录 StopParsingException。

然而,在某些提要上,解析器停止解析,但是在抛出异常和运行我的 catch 块之间存在很长的延迟,在此期间没有完成解析,但只有足够的时间来下载整个文件(这就是我怀疑正在发生)。

这是我的设置和错误处理代码:

public boolean parse(){
        SAXParserFactory factory = SAXParserFactory.newInstance();
        try {
            SAXParser parser = factory.newSAXParser();
            URL u = new URL(mUrl);
            URLConnection UC = u.openConnection();
            UC.setConnectTimeout(CONNECT_TIMEOUT);
            UC.setReadTimeout(CONNECT_TIMEOUT);
            InputStreamReader r = new InputStreamReader(UC.getInputStream());
            parser.parse(new InputSource(r), this);     
        }catch(SAXException sax)
        {
            Exception ex = sax.getException();
            if(ex != null)
            {
                if(ex instanceof StopParsingException)
                {
                    //Feed was intentionally stopped (i.e. reached episode limit)
                    DebugLog.w(TAG, "Feed update stopped for: " + mUrl, ex);
                    return true;
                }else
                {
                    //Something went wrong, non-standard error
                    DebugLog.e(TAG, "Feed update failed for: " + mUrl, ex);
                    return false;
                }
            }else{
                //Something went wrong, non-standard error
                DebugLog.e(TAG, "Feed update failed fatally for: " + mUrl, sax);
                return false;
            }

        }
        catch(Exception e){
            DebugLog.e(TAG, "Unknown parse error on feed: "+mUrl, e);
            return false;
        }
        DebugLog.i(TAG, "Entire Feed Parsed successfully: "+mUrl);
        return true;
    }

当满足我的条件之一时,我使用以下代码:

throw (new SAXException(new StopParsingException("Max Items reached")));

例如停止解析器。

我的猜测是,当我抛出异常时,SAXParser 停止工作,但 InputSteamReader 继续从服务器下载 rss 提要,因为这几乎正是我的日志显示的时间。

我的连接设置是否有问题导致只有一些服务器不与我合作?

或者,有没有办法在抛出我的 SAXException 之前直接安全地停止 InputStream,这样我就没有这个问题了?

4

1 回答 1

0

SAX 解析器可能正试图以某种方式“恢复”并读取您的输入流以(例如)关闭匹配的标签。如果发生这种情况,您可以通过在抛出异常之前关闭输入流来阻止它。

另一种选择是注册一个错误处理程序。事实上,javadoc 建议这可能是更正确的方法。

于 2011-03-06T22:46:10.100 回答