關於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方法裏面進行文件的寫入的,所以我就在這裏判斷,如果文件寫入完畢,就認爲文件下載完畢,然後開始安裝,但是有時候依然是會存在包解析失敗的情況,看來這樣子也不行了,歸根結底都是文件並沒有真正的下載完畢,卻開始安裝了。所以我就試着當同時滿足這兩個條件時候開始安裝,即下載進度大於等於文件長度且文件寫入執行完畢時候。這樣子果然沒出現過解析失敗的情況了。不過還是比較奇怪,單純的通過進度或者文件讀寫爲何不能判斷文件已經下載完畢了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章