У меня есть странная проблема. Я получаю следующую ошибку, которая вызывает завершение силы:
org.apache.harmony.xml. ExpatParser$ParseException: В строке 1, столбец 0: никакой элемент не найден в org.apache.harmony.xml. ExpatParser.parseFragment(ExpatParser.java:508) в org.apache.harmony.xml. ExpatParser.parseDocument(ExpatParser.java:467) в org.apache.harmony.xml. ExpatReader.parse(ExpatReader.java:329) в org.apache.harmony.xml. ExpatReader.parse(ExpatReader.java:286)
После нажатия кнопки Force Close воссоздается Действие, и парсинг завершается без помехи. Я использую следующий фрагмент кода внутри doInBackground AsyncTask:
URL serverAddress = new URL(url[0]);
HttpURLConnection connection = (HttpURLConnection) serverAddress.openConnection();
connection.setRequestMethod("GET");
connection.setDoOutput(true);
connection.setReadTimeout(10000);
connection.connect();
InputStream stream = connection.getInputStream();
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
xr.parse(new InputSource(stream)); // The line that throws the exception
Почему был бы завершение силы Действия и затем выполнение без каких-либо проблем сразу после? BufferedInputStream несколько отличался бы? Я экранирован.:(
Спасибо за внимание все.
Обновление: оказывается, что HttpURLConnection.getResponseCode () возвращается-1 время от времени, таким образом, InputStream, вероятно, правильно не устанавливается.
HTTPURLConnection connection = (HttpURLConnection) serverAddress.openConnection();
connection.setRequestMethod("GET");
connection.setDoOutput(true);
Эти строки немного странные. Это HTTPURLConnection
или HttpURLConnection
? Метод запроса по умолчанию уже GET
. Однако setDoOutput (true)
принудительно это в POST
.
Я бы заменил все эти строки на
URLConnection connection = serverAddress.openConnection();
и повторил попытку. Может случиться так, что он вернул ошибку, потому что вы принудительно отправили POST
и ничего не записали в вывод (тело запроса). connection.connect ()
, кстати, уже неявно вызывается connection.getInputStream ()
, так что эта строка тоже лишняя.
Обновление : работает ли следующее в целях тестирования?
BufferedReader reader = new BufferedReader(new InputStreamReader(stream, "UTF-8"));
for (String line; (line = reader.readLine()) != null;) {
System.out.println(line);
}
reader.close();
Не знаю, исправили ли вы это, но у меня была та же проблема. Это было странно, в эмуляторе все работало нормально, но на телефоне всегда выдавала ошибку xr.parse ()
. Даже когда я напечатал InputStream
, он дал бы мне допустимый вывод xml-документа. Похоже, проблема заключалась в создании объекта InputSource
Вот как я это исправил: вместо использования InputStream
для создания вашего InputSource
я только что создал источник ввода напрямую из строки url.
InputSource a = new InputSource(url_string);
где url_string - это просто строка с вашим URL. Не спрашивайте меня, почему это работает ... Мне это не очень нравится, потому что нет способа проверить тайм-ауты и тому подобное.Но это работает, дайте мне знать, как это происходит!
На родственной примечания к дизайну, загрузка содержимого URL-адреса никогда не должна принудительно закрывать действие - я рекомендую поместить все это в реализацию AsyncTask и сообщить или повторить попытку после того, как вы вернетесь в поток графического интерфейса.
Согласно InputStream
javadoc метод будет блокироваться до тех пор, пока данные не станут доступными или не будет обнаружен EOF. Итак, другая сторона Socket должна закрыть его - тогда вызов inStream.read () вернется.
Если вы используете BufferedReader
, вы можете читать построчно. Метод readLine ()
вернется, как только будет прочитана строка из HTTP-ответа.