OKHttp 下載文件下載不完整問題——OkHttpClient.Builder的坑

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í)間、攔截器等。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 參考:https://blog.csdn.net/fightingxia/article/details/7094...
    文強(qiáng)小弟閱讀 1,286評(píng)論 0 1
  • 這篇文章主要總結(jié)Android著名網(wǎng)絡(luò)框架-okhttp的基礎(chǔ)使用。 okhttp是什么 okhttp是Andro...
    磨礪營(yíng)IT閱讀 795評(píng)論 0 1
  • 最近實(shí)際項(xiàng)目需要處理網(wǎng)絡(luò)請(qǐng)求(一般是個(gè)app都會(huì)有的),于是接觸了okhttp,目前也就剛剛會(huì)使用的程度,不...
    風(fēng)二嘰閱讀 795評(píng)論 0 1
  • 人生有盡頭嗎? 人生沒有盡頭嗎? 死亡即是終點(diǎn)嗎? 輪回會(huì)是新的開始嗎? 捏起一片已落下的枯黃的落葉, 望著枝頭將...
    白秋鴻閱讀 989評(píng)論 3 8
  • 緣由: 學(xué)習(xí)小程序案例,結(jié)果案例是用es6寫的,只能先去了解下es6(我js也不太好,總之一個(gè)字,差!),然后,那...
    奶酪凌閱讀 470評(píng)論 5 0

友情鏈接更多精彩內(nèi)容