本文已受權「劉望舒」微信公衆號獨家原創發佈java
本文將直接使用RxHttp庫實現文件上傳、下載、斷點下載、進度的監聽,不對RxHttp作過多講解,若是對RxHttp不瞭解,請移步git
RxHttp 一條鏈發送請求,新一代Http請求神器(一)github
RxHttp 一條鏈發送請求之註解處理器 Generated API(四)post
本文目的在於讓更多的讀者知道RxHttp庫,若是您已閱讀上面4篇文章,本文可直接跳過,感謝你的支持。🙏🙏。學習
RxHttp.postForm("http://...") //發送Form表單形式的Post請求
.add("key", "value")
.add("file1", new File("xxx/1.png")) //添加file對象
.add("file2", new File("xxx/2.png"))
.asString() //asXXX操做符,是異步操做
.as(RxLife.asOnMain(this)) //感知生命週期,並在主線程回調
.subscribe(s -> {
//上傳成功,拿到Http返回值,這裏返回值爲String類型
}, throwable -> {
//上傳失敗
});
複製代碼
注:
若是須要對Http的返回值作解析,可在使用asParser
操做符時,傳入一個解析器Parser
this
帶進度上傳
使用asUpload(Progress,Scheduler)
操做符url
RxHttp.postForm("http://www.......") //發送Form表單形式的Post請求
.add("key1", "value1")//添加參數,非必須
.add("file1", new File("xxx/1.png"))
.asUpload(progress -> {
//上傳進度回調,0-100,僅在進度有更新時纔會回調,最多回調101次,最後一次回調Http執行結果
int currentProgress = progress.getProgress(); //當前進度 0-100
long currentSize = progress.getCurrentSize(); //當前已上傳的字節大小
long totalSize = progress.getTotalSize(); //要上傳的總字節大小
}, AndroidSchedulers.mainThread())//指定主線程回調
.as(RxLife.as(this)) //感知生命週期
.subscribe(s -> { //s爲String類型,由SimpleParser類裏面的泛型決定的
//上傳成功,處理相關邏輯
}, throwable -> {
//上傳失敗,處理相關邏輯
});
複製代碼
注:
若是須要對Http的返回值作解析,可以使用asUpload(Parser,Progress,Scheduler)
方法,傳入一個解析器Parser
spa
//文件存儲路徑
String destPath = getExternalCacheDir() + "/" + System.currentTimeMillis() + ".apk";
RxHttp.get("http://update.9158.com/miaolive/Miaolive.apk")
.asDownload(destPath) //注意這裏使用asDownload操做符,並傳入本地路徑
.as(RxLife.asOnMain(this)) //感知生命週期,並在主線程回調
.subscribe(s -> {
//下載成功,回調文件下載路徑
}, throwable -> {
//下載失敗
});
複製代碼
帶進度下載
使用asDownload(String,Consumer,Scheduler)
方法
//文件存儲路徑
String destPath = getExternalCacheDir() + "/" + System.currentTimeMillis() + ".apk";
RxHttp.get("http://update.9158.com/miaolive/Miaolive.apk")
.asDownload(destPath, progress -> {
//下載進度回調,0-100,僅在進度有更新時纔會回調,最多回調101次,最後一次回調文件存儲路徑
int currentProgress = progress.getProgress(); //當前進度 0-100
long currentSize = progress.getCurrentSize(); //當前已下載的字節大小
long totalSize = progress.getTotalSize(); //要下載的總字節大小
}, AndroidSchedulers.mainThread()) //指定主線程回調
.as(RxLife.as(this)) //感知生命週期
.subscribe(s -> {//s爲String類型,這裏爲文件存儲路徑
//下載完成,處理相關邏輯
}, throwable -> {
//下載失敗,處理相關邏輯
});
複製代碼
斷點下載
相較於下載
,僅須要調用setRangeHeader
方法傳入開始及結束位置便可(結束位置不傳默認爲文件末尾),其它沒有任何差異
String destPath = getExternalCacheDir() + "/" + "Miaobo.apk";
long length = new File(destPath).length(); //已下載的文件長度
RxHttp.get("http://update.9158.com/miaolive/Miaolive.apk")
.setRangeHeader(length) //設置開始下載位置,結束位置默認爲文件末尾
.asDownload(destPath)
.as(RxLife.asOnMain(this)) //加入感知生命週期的觀察者
.subscribe(s -> { //s爲String類型
Log.e("LJX", "breakpointDownloadAndProgress=" + s);
//下載成功,處理相關邏輯
}, throwable -> {
//下載失敗,處理相關邏輯
});
複製代碼
帶進度斷點下載
相較於帶進度下載
僅須要調用setRangeHeader
方法傳入開始及結束位置便可(結束位置不傳默認爲文件末尾),其它沒有任何差異
String destPath = getExternalCacheDir() + "/" + "Miaobo.apk";
long length = new File(destPath).length(); //已下載的文件長度
RxHttp.get("http://update.9158.com/miaolive/Miaolive.apk")
.setRangeHeader(length) //設置開始下載位置,結束位置默認爲文件末尾
.asDownload(destPath, progress -> {
//下載進度回調,0-100,僅在進度有更新時纔會回調
int currentProgress = progress.getProgress(); //當前進度 0-100
long currentSize = progress.getCurrentSize(); //當前已下載的字節大小
long totalSize = progress.getTotalSize(); //要下載的總字節大小
}, AndroidSchedulers.mainThread()) //指定主線程回調
.as(RxLife.as(this)) //加入感知生命週期的觀察者
.subscribe(s -> { //s爲String類型
//下載成功,處理相關邏輯
}, throwable -> {
//下載失敗,處理相關邏輯
});
複製代碼
注:
上面帶進度斷點下載中,返回的進度會從0開始,若是須要銜接上次下載的進度,則調用asDownload(String,long,Consumer,Scheduler)
方法傳入上次已經下載好的長度(第二個參數),以下:
String destPath = getExternalCacheDir() + "/" + "Miaobo.apk";
long length = new File(destPath).length(); //已下載的文件長度
RxHttp.get("http://update.9158.com/miaolive/Miaolive.apk")
.setRangeHeader(length) //設置開始下載位置,結束位置默認爲文件末尾
.asDownload(destPath, length, progress -> {
//下載進度回調,0-100,僅在進度有更新時纔會回調
int currentProgress = progress.getProgress(); //當前進度 0-100
long currentSize = progress.getCurrentSize(); //當前已下載的字節大小
long totalSize = progress.getTotalSize(); //要下載的總字節大小
}, AndroidSchedulers.mainThread()) //指定主線程回調
.as(RxLife.as(this)) //加入感知生命週期的觀察者
.subscribe(s -> { //s爲String類型
//下載成功,處理相關邏輯
}, throwable -> {
//下載失敗,處理相關邏輯
});
複製代碼
多任務下載咱們可使用RxJava的merge
操做符,以下:
List<Observable<String>> downList = new ArrayList<>();
for (int i = 0; i < 3; i++) {
String destPath = getExternalCacheDir() + "/" + i + ".apk";
String url = "http://update.9158.com/miaolive/Miaolive.apk"
Observable<String> down = RxHttp.get(url)
.asDownload(destPath);
downList.add(down);
}
//經過RxJava內部線程池,多任務並行下載
Observable.merge(downList)
.as(RxLife.as(this))
.subscribe(s -> {
//單個任務下載完成
}, throwable -> {
//下載出錯
}, () -> {
//全部任務下載完成
});
複製代碼
若是想監聽每一個任務的下載進度,也簡單,用老方法便可,以下:
List<Observable<String>> downList = new ArrayList<>();
for (int i = 0; i < 3; i++) {
String destPath = getExternalCacheDir() + "/" + i + ".apk";
String url = "http://update.9158.com/miaolive/Miaolive.apk"
Observable<String> down = RxHttp.get(url)
.asDownload(destPath, progress -> {
//單個下載任務進度回調
}, AndroidSchedulers.mainThread())
downList.add(down);
}
//經過RxJava內部線程池,多任務並行下載
Observable.merge(downList)
.as(RxLife.as(this))
.subscribe(s -> {
//單個任務下載完成
}, throwable -> {
//下載出錯
}, () -> {
//全部任務下載完成
});
複製代碼
與多任務下載同理,再也不講述。
好了,文件上傳、下載相關就介紹到這裏了,到這你會發現,無論是上傳仍是下載,進度的監聽都極其的類似,極大的下降了學習成本。怎麼樣?是否是很優雅,歡迎打臉!!
最後,很大一部分功勞都要歸功於RxJava的強大,感謝RxJava,向它致敬!!!!
下一文將繼續使用RxJava強大的操做符,看看它與RxHttp又能擦出怎樣的火花。 轉載請註明出處,謝謝🙏