xUtils3 下载文件不执行 onLoading()

最近在做项目的时候遇到一个问题,使用xUtils做文件下载需要进度,但是发现一直不走onLoading()方法,其他的回调函数onWaiting(),onStarted(),onSuccess(),onFinished()都会走,这就奇怪了,难道我参数有问题?不应该啊,问了验证这个问题,我将请求的url链接地址在浏览器中打开,是会显示下载文件框的,这就表示参数没有问题,那会不会是RequestParams配置有问题?

RequestParams params = new RequestParams(url);
params.setAutoResume(true);
params.setAutoRename(false);
params.setSaveFilePath(savePath);
x.http().get(params, callback);

经过排查也没有问题,和网上大多数的配置信息基本一致,那就奇怪了,参数没问题,配置也没问题,url链接也能在浏览器中显示出来,xUtils也能请求下载成功,就是不走onLoading(),开始对这个问题感到好奇,就在网上各种找,当然也有相同的人有这个问题,但是都没有人做出解答,没办法只能硬着头皮自己解决。

为了进一步验证是不是客户端的问题,接着我就在想拿网上的任意一个图片地址试试看能不能下载成功,如果网上的一个图片地址能执行onLoading(),那就证明我的配置没有问题,是后台服务器出现了问题,结果确实证实了我的这个想法,果然走了onLoading(),那现在问题清晰了,就是服务端返回的问题。

那这两个请求结果有什么不一样呢,可以用Postman看一下这两个的Response Headers信息,结果发现在Headers中并没有返回Content-Length,Content-Length表示传输的实体长度,以字节为单位(在请求方法为HEAD时表示会要发送的长度,但并不实际发送,具体介绍可以网上找找有很多),然后就跟后台沟通,确实没有加这个Content-Length,加上之后再次请求,我去,还是不执行onLoading(),这就奇了怪了,耐下性子继续看,里面有这么一句,Content-Length受Transfer-Encoding影响很大,只要Transfer-Encoding不为identity,则实际传输长度由编码中的chunked决定,Content-Length即使存在也被忽略。于是又让后台加上了Transfer-Encoding为binary,至于它们的定义这里不做多的介绍,加上之后果然好使了,终于执行了onLoading,这下终于可以做进度提示了

记录一次日常问题的方法解决,以便之后再次碰见不用再浪费时间

你可能感兴趣的:(xUtils3 下载文件不执行 onLoading())