Почему мой InputStream продолжает загружать файл после остановки SAX Parser? - PullRequest
1 голос
/ 07 марта 2011

Я работаю над парсером 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, чтобы у меня не было этой проблемы?

1 Ответ

0 голосов
/ 07 марта 2011

Вполне возможно, что SAX-парсер пытается каким-то образом "восстановить" и читает ваш входной поток, чтобы (например) закрыть совпадающие теги.Если это происходило, вы, вероятно, могли бы предотвратить это, закрыв входной поток перед тем, как выдать свое исключение.

Другой альтернативой может быть регистрация обработчика ошибок .На самом деле Javadoc предполагает, что это может быть более правильным подходом.

...