OkHttpClient.Builder() 的一個(gè)坑
OKHttp自身沒有提供下載文件的API,只能我們自己實(shí)現(xiàn)。但是自己使用OKHttp的respone獲取inputStrem來(lái)下載文件一直出現(xiàn)一個(gè)文件下載了一部分就不下載了。我要下載的文件是80M,但是每次都是下載到30k的時(shí)候OKHttp的就會(huì)告訴下載結(jié)束。
起初的錯(cuò)誤代碼如下:
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, "返回?cái)?shù)據(jù)成功,開始寫入");
? ? ? ? ? ? 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, "結(jié)束");
? ? ? ? ? ? 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();
? ? }
}
經(jīng)過(guò)反復(fù)修改嘗試,后來(lái)確定關(guān)鍵問題是出現(xiàn)在? new OkHttpClient.Builder()上。

將:
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.cache(cache);
? client = builder.build();
改為:
OkHttpClient client = new OkHttpClient();
其它的代碼不變,莫名其妙的就解決了問題。至今也沒猜到的根本的原因,但是確實(shí)使用前者下載就會(huì)出現(xiàn)問題,使用后者就沒有問題。
不過(guò)這種方式還是有一個(gè)遺留問題,就沒有辦法使用builder設(shè)置各種網(wǎng)絡(luò)請(qǐng)求參數(shù)了,比如網(wǎng)絡(luò)超時(shí)時(shí)間、攔截器等。