Я работаю над парсером RSS-каналов в Android и внедрил парсер SAX, который отлично работает в большинстве ситуаций.
Однако у меня возникли проблемы с некоторыми из моих тестовых каналов. После того, как я проанализировал указанное количество элементов ленты, я выбрасываю SAXException, чтобы остановить синтаксический анализатор, что AFAIK является правильным способом сделать это. В большинстве каналов это останавливает синтаксический анализ, и мой блок catch (см. Ниже) обрабатывает и регистрирует исключение StopParsingException.
Однако в НЕКОТОРЫХ каналах синтаксический анализатор прекращает синтаксический анализ, но между генерируемым исключением и выполнением моего блока перехвата существует большая задержка, во время которой не выполняется синтаксический анализ, но достаточно времени, чтобы загрузить весь файл ( что я подозреваю, что происходит).
Вот мой код установки и обработки ошибок:
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-канал с сервера, так как это почти точно время, которое показывают мои журналы.
Что-то не так с моей настройкой соединения, из-за которой только некоторые серверы не взаимодействуют со мной?
В качестве альтернативы, есть ли способ безопасно остановить этот InputStream перед тем, как выбросить мое SAXException, чтобы у меня не было этой проблемы?