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