美文网首页
OKHttp 下载文件下载不完整问题——OkHttpClient

OKHttp 下载文件下载不完整问题——OkHttpClient

作者: 王朋6 | 来源:发表于2019-10-25 11:07 被阅读0次

    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设置各种网络请求参数了,比如网络超时时间、拦截器等。

    相关文章

      网友评论

          本文标题:OKHttp 下载文件下载不完整问题——OkHttpClient

          本文链接:https://www.haomeiwen.com/subject/dbcsvctx.html