关于okhttp下载文件的一点发现

来源:互联网 发布:网络女主播闪现 编辑:程序博客网 时间:2024/05/17 06:25

          上一个项目用的是retrofit做的网络请求,所以自然升级时候下载apk时候,也是用的retrofit。但是这个项目是接手了别人写了一部分的项目,所以网络请求就沿用了之前的okhttp了。但是再用它下载文件apk时候发现了一点问题,不知道是自己用的不对,还是怎么了,但是还是通过一些方法解决了。

          遇到的问题就是如何判断下载结束了。在原来用retrofit和Rxjava时候,下载apk会定义一个接口大多如下:

         @Streaming
         @GET
         Observable<ResponseBody> downloadApk(@Url String url);,然后呢,在使用时候,我们一般会subscribe一个Observer(这里默认读者熟悉retrofit和Rxjava,哈哈),通过这个Observer的四个方法onError()知道现在下载过程中出现异常,同样可以通过onComplete()知道下载完毕了,这些都没有问题了。但是在只是使用okhttp时候如何得知下载完毕呢?

        当然下载我们都会通过给okhttp添加拦截器知道其下载进度,所以刚开始是通过当下载进度大于等于下载文件的长度时候,就认为其下载完毕了,很多时候都没问题,但是有时候会出现下载完毕解析包异常的问题,这就说明通过下载进度判断是不靠谱的,apk还没下载完毕,但是进度已经满足了上述的条件了。然后我就想,既然这样不好使,那就通过文件读写完毕来判断吧,都是在okhttp执行时候的回调callback的onResponse方法里面进行文件的写入的,所以我就在这里判断,如果文件写入完毕,就认为文件下载完毕,然后开始安装,但是有时候依然是会存在包解析失败的情况,看来这样子也不行了,归根结底都是文件并没有真正的下载完毕,却开始安装了。所以我就试着当同时满足这两个条件时候开始安装,即下载进度大于等于文件长度且文件写入执行完毕时候。这样子果然没出现过解析失败的情况了。不过还是比较奇怪,单纯的通过进度或者文件读写为何不能判断文件已经下载完毕了。

原创粉丝点击