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()上。


OKHttp 下载文件下载不完整问题——OkHttpClient.Builder的坑_第1张图片


将:

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

builder.cache(cache);

  client = builder.build();

改为:

OkHttpClient client = new OkHttpClient();

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

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

你可能感兴趣的:(OKHttp 下载文件下载不完整问题——OkHttpClient.Builder的坑)