为什么我的InputStream在停止SAX Parser后继续下载文件?

时间:2011-03-06 21:34:32

标签: java android networking saxparser

我正在使用Android中的RSS提要解析器,我已经实现了一个SAX解析器,在大多数情况下都可以正常工作。

但是,我在一些测试源上遇到了问题。在我解析了指定数量的feed项之后,我抛出一个SAXException来停止解析器,AFAIK是正确的方法。在大多数feed上,这会停止解析,我的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 feed,因为这几乎就是我的日志显示的时间。

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

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

1 个答案:

答案 0 :(得分:0)

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

另一种选择是注册error handler。实际上,javadoc认为这可能是更正确的方法。