我正在 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,这样我就没有这个问题了?