OKHttp 下载文件下载不完整问题——OkHttpClient.Builder的坑

OkHttpClient.Builder() 的一个坑

OKHttp自身没有提供下载文件的API,只能我们自己实现。但是自己使用OKHttp的respone获取inputStrem来下载文件一直出现一个文件下载了一部分就不下载了。我要下载的文件是80M,但是每次都是下载到30k的时候OKHttp的就会告诉下载结束。

起初的错误代码如下:

int cacheSize =10 *1024 *1024;

  File sdcache =new File(String.valueOf(Environment.getExternalStorageDirectory()) +"/com.coactsoft.vxiaotongdp/fileLoad");

    Cache cache =new Cache(sdcache.getAbsoluteFile(), cacheSize);

    OkHttpClient.Builder builder =new OkHttpClient.Builder();

    builder.cache(cache);

    client = builder.build();

    Request request =new Request.Builder().url(url).get().build();

    try {

response =client.newCall(request).execute();

        if (!response.isSuccessful()) {

Log.d(TAG, "下载失败");

            throw new IOException("Unexpected code " +response);

        }else {

Log.d(TAG, "返回数据成功,开始写入");

            InputStream is;

            is =response.body().byteStream();

            FileOutputStream fos;

            String pa = Environment.getExternalStorageDirectory().toString();

            final File ff =new File(pa +"/fileLoad",name);

            if (!ff.exists()) {

ff.createNewFile();

            }

fos =new FileOutputStream(ff);

            int len =0;

            long sum =0;

            byte[] bytes =new byte[1024];

            while ((len = is.read(bytes)) != -1) {

fos.write(bytes, 0, len);

                sum+=len;

              Log.e("下载"," "+sum);

            }

if (is !=null) {

is.close();

            }

if (fos !=null) {

fos.close();

            }

Log.d(TAG, "结束");

            mDelivery.post(new Runnable() {

@Override

                public void run() {

callBack.downLoadFinish(ff.getPath());

                }

});

        }

}catch (Exception e) {

mDelivery.post(new Runnable() {

@Override

            public void run() {

callBack.fownLoadError();

            }

});

        e.printStackTrace();

    }

}

经过反复修改尝试,后来确定关键问题是出现在  new OkHttpClient.Builder()上。



将:

OkHttpClient.Builder builder = new OkHttpClient.Builder();

builder.cache(cache);

  client = builder.build();

改为:

OkHttpClient client = new OkHttpClient();

其它的代码不变,莫名其妙的就解决了问题。至今也没猜到的根本的原因,但是确实使用前者下载就会出现问题,使用后者就没有问题。

不过这种方式还是有一个遗留问题,就没有办法使用builder设置各种网络请求参数了,比如网络超时时间、拦截器等。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 参考:https://blog.csdn.net/fightingxia/article/details/7094...
    文强小弟阅读 1,286评论 0 1
  • 这篇文章主要总结Android著名网络框架-okhttp的基础使用。 okhttp是什么 okhttp是Andro...
    磨砺营IT阅读 793评论 0 1
  • 最近实际项目需要处理网络请求(一般是个app都会有的),于是接触了okhttp,目前也就刚刚会使用的程度,不...
    风二叽阅读 795评论 0 1
  • 人生有尽头吗? 人生没有尽头吗? 死亡即是终点吗? 轮回会是新的开始吗? 捏起一片已落下的枯黄的落叶, 望着枝头将...
    白秋鸿阅读 989评论 3 8
  • 缘由: 学习小程序案例,结果案例是用es6写的,只能先去了解下es6(我js也不太好,总之一个字,差!),然后,那...
    奶酪凌阅读 468评论 5 0

友情链接更多精彩内容