我有一个奇怪的问题。我收到以下错误导致强制关闭:
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) at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:329) 在org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:286)
单击“强制关闭”按钮后,将重新创建“活动”,并且解析完成顺利进行。我在AsyncTask的doInBackground中使用以下代码片段:
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
为什么Activity强制关闭然后立即运行而没有任何问题? BufferedInputStream会有什么不同吗?我很困惑。 :(
感谢大家的时间。
更新:事实证明,HttpURLConnection.getResponseCode()经常返回-1,因此可能没有正确设置InputStream。
答案 0 :(得分:6)
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();
答案 1 :(得分:2)
我不知道你是否解决了这个问题,但我遇到了同样的问题。这很奇怪,它可以在模拟器中正常工作,但随后在手机上,总是给我xr.parse()
错误。即使我打印InputStream
,它也会给我xml文档的合法输出。似乎问题在于创建InputSource
对象
以下是我修复它的方法:而不是使用InputStream
来创建InputSource
我直接从url字符串创建了输入源。
InputSource a = new InputSource(url_string);
其中url_string只是一个包含您网址的字符串。不要问我它为什么有效......我真的不喜欢它,因为没有办法检查超时和类似的东西。但是它有效,让我知道它是怎么回事!
答案 2 :(得分:1)
每InputStream
个javadoc,该方法将阻塞,直到数据可用或遇到EOF。所以,Socket的另一面需要关闭它 - 然后inStream.read()调用将返回。
如果您使用BufferedReader
,则可以逐行阅读。只要读取HTTP响应中的一行,readLine()
方法就会返回。
答案 3 :(得分:1)
在相关的设计说明中,加载URL的内容永远不应强制关闭活动 - 我建议将所有这些放入AsyncTask实现中,并在返回GUI线程后报告或重试。
答案 4 :(得分:1)
即使我遇到同样的问题。
我第一次使用InputStream
中的Scanner
来打印它的内容。
然后尝试在XML解析器中传递它。
问题在于我没有关闭Scanner
对象。并在解析器中使用Inputstream
。
关闭扫描仪对象后,我能够解决这个问题。
答案 5 :(得分:0)
我遇到了同样的问题并且没有意义,因为我直接从InputSource解析。当我修改代码以在xml解析之前将结果拉入字符串时,我发现问题只是一个错误的Web服务方法名称,并且该服务报告的错误消息是杀手。