我正在使用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,以便我没有这个问题?
答案 0 :(得分:0)
SAX解析器可能尝试以某种方式“恢复”并读取输入流(例如)关闭匹配的标记。如果发生这种情况,您可以通过在抛出异常之前关闭输入流来阻止它。
另一种选择是注册error handler。实际上,javadoc认为这可能是更正确的方法。