今天用okHttp写了个从本地的Apache服务器上下载资源的安卓app,然后发现偶尔的下载会抛出java.net.ProtocolException: unexpected end of stream的异常,苦思不得结果后上百度查找,百度有很多分析,有可能的原因是响应头Content-length和实体长度不同,找到几个方法,有的说在请求头中添加Accept-Encoding,值为identity;有的说添加Connection,
.addHeader("Accept-Encoding", "identity")
.addHeader("Connection", "keep-alive")
但是没有用,还是会抛出这个异常,然后我以为是okHttp的问题,改用HttpURLConnection,发现还是会抛出类似的异常。
然后抛出这个异常后,我打印已下载文件内容的长度,发现只比响应头的Content-length少一字节。
然后实在找不到解决方法,我只能用最笨的方法,捕捉这个异常,启动一个新线程断点续传
最后我也没清楚为什么会这样,但是我后来嫌下载太慢,把输入流的缓冲区从1024改成8096
int len = 0;
byte[] b = new byte[8096];
while ((len = inputStream.read(b)) != -1) {
...
}
然后这个异常我就没见到过了,误打误撞程序就莫名其妙没问题了。
折腾了半天,不清楚原因,记录下来,希望有大佬可以解答我的疑惑