我目前的问题与this one非常相似。
我有一个downloadFile(URL)
函数,可以创建一个新的HttpURLConnection,打开它,读取它,返回结果。当我多次在同一个URL上调用此函数时,第二次它几乎总是返回一个响应代码-1(但不会抛出异常!!!)。
top answer in that question非常有帮助,但我想了解一些事情。
因此,如果将http.keepAlive设置为false可以解决问题,那么它是什么意思呢?服务器以违反http协议的方式响应?或者更可能的是,我的代码在某种程度上违反了协议?跟踪会告诉我什么?我应该寻找什么?
这是怎么回事:
您需要从错误中读取所有内容 流。否则,它会 混淆下一个连接,那是 原因-1。
这是否意味着如果响应是某种类型的错误(这将是什么响应代码?),流HAS要完全读取?此外,每次我尝试http请求时,我基本上都会创建一个新连接,然后在最后disconnect()
。
然而,在我的情况下,我没有得到401或其他什么。它总是200.但我的第二个连接几乎总是失败。这是否意味着我应该读取的其他数据我不是(以类似的方式必须完全读取错误流)?
请帮助解释一下这个问题?我觉得我缺少一些基本的http协议理解。
PS如果我只是使用Apache HttpClient,我是否不必处理所有这些协议细节?它会照顾我的一切吗?
答案 0 :(得分:3)
默认HTTP URL处理程序中对keep-alive的支持是非常错误的。我们总是把它关掉。
如果要保持活动状态,请将Apache HttpClient与池化连接管理器一起使用。如果你不想改变你的代码,你可以得到另一个这样的处理程序,
http://www.innovation.ch/java/HTTPClient/
如果您的第二个连接始终失败,则表示您的服务器不支持keepalive。使用Keepalive,HTTP处理程序只会使连接保持打开状态(即使您调用disconnect也是如此)。如果不支持keep-alive,则服务器会关闭连接但是处理程序在您对连接发出下一个请求之前不知道,因此第二个连接失败。
关于读取错误流,它仅适用于非200响应的情况。
答案 1 :(得分:0)
我想你可能正在讨论这个HttpURLConnection错误,修复了froyo:
http://code.google.com/p/android/issues/detail?id=2939
查看其他解决方法的错误。如果这不是您遇到的错误,请在http://code.google.com/p/android/issues/entry处针对可重复的测试用例提出错误。