Android OkHttp+RxJava 史上最優雅的實現檔案上傳/下載進度的監聽

不怕天黑發表於2019-01-27

如果還未看過之前HttpSener系列的文章,請移步

HttpSender 開篇之功能使用篇,超好用、功能超級強大的Http請求框架(一)

HttpSender 介紹篇之生命週期、公共引數相關配置(二)

HttpSender 介紹篇之Parser介紹(三)

HttpSender 介紹篇之Param介紹(四)

HttpSender 介紹篇之多請求序列與並行(五)

HttpSender 擴充套件篇之Parser擴充套件(六)

HttpSender 擴充套件篇之Param擴充套件(七)

檔案下載進度監聽

String url = "http://update.9158.com/miaolive/Miaolive.apk";
//檔案儲存路徑
String destPath = getExternalCacheDir() + "/" + System.currentTimeMillis() + ".apk";
Disposable disposable = HttpSender
        .download(Param.get(url), destPath) //注意這裡使用download操作符
        .observeOn(AndroidSchedulers.mainThread())
        .doOnNext(progress -> {
            //下載進度回撥,0-100,僅在進度有更新時才會回撥,最多回撥101次,最後一次回撥檔案儲存路徑
            int currentProgress = progress.getProgress(); //當前進度 0-100
            long currentSize = progress.getCurrentSize(); //當前已下載的位元組大小
            long totalSize = progress.getTotalSize();     //要下載的總位元組大小
            String filePath = progress.getResult(); //檔案儲存路徑,最後一次回撥才有內容
        })
        .filter(Progress::isCompleted)//下載完成,才繼續往下走
        .map(Progress::getResult) //到這,說明下載完成,返回下載目標路徑
        .subscribe(s -> {//s為String型別,這裡為檔案儲存路徑
            //下載完成,處理相關邏輯
        }, throwable -> {
            //下載失敗,處理相關邏輯
        });
複製程式碼

檔案上傳進度監聽

String url = "http://www.......";
Param param = Param.postForm(url) //傳送Form表單形式的Post請求
        .add("file1", new File("xxx/1.png"))
        .add("file2", new File("xxx/2.png"))
        .add("key1", "value1")//新增引數,非必須
        .add("key2", "value2")//新增引數,非必須
        .addHeader("versionCode", "100"); //新增請求頭,非必須
Disposable disposable = HttpSender
        .upload(param, new SimpleParser<String>() {}) //注:如果需要監聽上傳進度,使用upload操作符
        .observeOn(AndroidSchedulers.mainThread()) //主執行緒回撥
        .doOnNext(progress -> {
            //上傳進度回撥,0-100,僅在進度有更新時才會回撥,最多回撥101次,最後一次回撥Http執行結果
            int currentProgress = progress.getProgress(); //當前進度 0-100
            long currentSize = progress.getCurrentSize(); //當前已上傳的位元組大小
            long totalSize = progress.getTotalSize();     //要上傳的總位元組大小
            String result = progress.getResult(); //Http執行結果,最後一次回撥才有內容
        })
        .filter(Progress::isCompleted)//過濾事件,上傳完成,才繼續往下走
        .map(Progress::getResult) //到這,說明上傳完成,拿到Http返回結果並繼續往下走
        .subscribe(s -> { //s為String型別,由SimpleParser類裡面的泛型決定的
            //上傳成功,處理相關邏輯
        }, throwable -> {
            //上傳失敗,處理相關邏輯
        });
複製程式碼

怎麼樣,是不是簡單,如果對HttpSender不瞭解的,請看我之前的文章,有疑問,請留言,我會第一時間進行解答。

相關文章