天天看點

關于okhttp下載下傳檔案的一點發現

          上一個項目用的是retrofit做的網絡請求,是以自然更新時候下載下傳apk時候,也是用的retrofit。但是這個項目是接手了别人寫了一部分的項目,是以網絡請求就沿用了之前的okhttp了。但是再用它下載下傳檔案apk時候發現了一點問題,不知道是自己用的不對,還是怎麼了,但是還是通過一些方法解決了。

          遇到的問題就是如何判斷下載下傳結束了。在原來用retrofit和Rxjava時候,下載下傳apk會定義一個接口大多如下:

         @Streaming

         @GET

         Observable<ResponseBody> downloadApk(@Url String url);,然後呢,在使用時候,我們一般會subscribe一個Observer(這裡預設讀者熟悉retrofit和Rxjava,哈哈),通過這個Observer的四個方法onError()知道現在下載下傳過程中出現異常,同樣可以通過onComplete()知道下載下傳完畢了,這些都沒有問題了。但是在隻是使用okhttp時候如何得知下載下傳完畢呢?

        當然下載下傳我們都會通過給okhttp添加攔截器知道其下載下傳進度,是以剛開始是通過當下載下傳進度大于等于下載下傳檔案的長度時候,就認為其下載下傳完畢了,很多時候都沒問題,但是有時候會出現下載下傳完畢解析包異常的問題,這就說明通過下載下傳進度判斷是不靠譜的,apk還沒下載下傳完畢,但是進度已經滿足了上述的條件了。然後我就想,既然這樣不好使,那就通過檔案讀寫完畢來判斷吧,都是在okhttp執行時候的回調callback的onResponse方法裡面進行檔案的寫入的,是以我就在這裡判斷,如果檔案寫入完畢,就認為檔案下載下傳完畢,然後開始安裝,但是有時候依然是會存在包解析失敗的情況,看來這樣子也不行了,歸根結底都是檔案并沒有真正的下載下傳完畢,卻開始安裝了。是以我就試着當同時滿足這兩個條件時候開始安裝,即下載下傳進度大于等于檔案長度且檔案寫入執行完畢時候。這樣子果然沒出現過解析失敗的情況了。不過還是比較奇怪,單純的通過進度或者檔案讀寫為何不能判斷檔案已經下載下傳完畢了。

繼續閱讀