RxDownload2 原始碼解析(一)
阿新 • • 發佈:2019-01-04
原始碼解析,如需轉載,請註明作者:Yuloran (t.cn/EGU6c76)
前言
造輪子者:Season_zlc
本篇概述 RxDownload2 主要功能及對應的技術要點
主要功能
- 使用 Retrofit+OKHTTP 來進行網路請求
- 基於 RxJava 打造,支援 RxJava 各種操作符鏈式呼叫
- 斷點續傳,根據服務端響應值自動判斷是否支援斷點續傳
- 若不支援斷點續傳,則進行傳統下載
- 多執行緒下載,可以設定最大執行緒,, 預設值為 3
- 檢測到網路連線失敗自動嘗試重連,, 並可配置最大重試次數,預設值為 3
- 支援根據 Last-Modified 欄位判斷服務端檔案是否變化
- 與伺服器進行驗證過程中,使用更輕便的 HEAD 請求方式僅獲取響應頭,減輕服務端負擔
技術淺析
- Android & Java 平臺的網路請求框架,賊好用
- 基於事件序列程式設計的框架,賊好用
- Http 協議的 HEAD 方法,攜帶 "Range" 請求頭,值為 "bytes=0-",判斷響應頭是否包含 "Content-Range"
- rfc2616 - Range
- rfc2616 - Content-Range
- 注意 Range 取值的偏移量是從 0 開始算的,如 0-499,返回的是 500 個位元組
- 下載中斷後,只能重新下載
- 這裡指伺服器支援斷點續傳時,可同時開啟幾個執行緒去下載一個檔案。而同時下載的最大任務數,是由訊號量控制的
- RxJava 的 retry 操作符
- Http 協議的 "Last-Modified" 響應頭和 "If-Modified-Since" 請求頭
- Http 協議的 HEAD 方法,檢測伺服器檔案是否修改、伺服器是否支援斷點下載、儲存檔案長度都是 HEAD 請求(響應非常快)。實際使用時,要看自己的伺服器是否支援 HEAD 請求,我們的伺服器就不支援!(正在定位解決...)
優點
- 原始碼變數命名、縮排風格統一
- 英文註釋、註釋習慣同 Android 原生
- 類的職責單一,非常好!
- RxJava 用的非常 6!
- 原始碼很精簡,方便閱讀
- 作者明明是大佬,卻很謙虛!去年就全部換成 Kotlin 了!
缺點
- 下載狀態封裝的不好,跟上游繫結在一起,無法直接判斷收到的狀態是哪個物件的