本文已授权「刘望舒」微信公众号独家原创发布

前言

本文将直接使用RxHttp库实现文件上传、下载、断点下载、进度的监听,不对RxHttp做过多讲解,如果对RxHttp不了解,请移步

RxHttp 一条链发送请求,新一代Http请求神器(一)

RxHttp 一条链发送请求之强大的数据解析功能(二)

RxHttp 一条链发送请求之强大的Param类(三)

RxHttp 一条链发送请求之注解处理器 Generated API(四)

本文目的在于让更多的读者知道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

带进度上传

带进度上传使用asUpload(Progress,Scheduler)操作符

  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-100long 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

下载

  //文件存储路径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-100long 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-100long 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-100long 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又能擦出怎样的火花。
转载请注明出处,谢谢?

Android OkHttp+RxJava 史上最优雅的实现文件上传/下载进度的监听相关推荐

  1. android上传图片文件至c 服务器,Android 史上最优雅的实现文件上传、下载及进度的监听...

    本文已授权「刘望舒」微信公众号独家原创发布 前言 本文将直接使用RxHttp库实现文件上传.下载.断点下载.进度的监听,不对RxHttp做过多讲解,如果对RxHttp不了解,请移步 本文目的在于让更多 ...

  2. png文件头_Android 史上最优雅的实现文件上传、下载及进度的监听

    作者丨Android技术干货分享https://www.jianshu.com/p/d643f5a8fead 前言 本文将直接使用RxHttp库实现文件上传.下载.断点下载.进度的监听,不对RxHtt ...

  3. Android-史上最优雅的实现文件上传、下载及进度的监听,android自定义控件开发入门与实战

    注:如果需要对Http的返回值做解析,可在使用uploadProgress操作符时,传入一个解析器Parser 下载 //文件存储路径 String destPath = getExternalCac ...

  4. Android-史上最优雅的实现文件上传、下载及进度的监听,网易严选Android开发三面面经

    .add("key", "value") .add("file1", new File("xxx/1.png")) // ...

  5. Android-史上最优雅的实现文件上传、下载及进度的监听,androidrom开发面试题

    RxHttp.postForm("http://-") //发送Form表单形式的Post请求 .add("key", "value") . ...

  6. Android-史上最优雅的实现文件上传、下载及进度的监听,flutter热更新方案

    }); 注:如果需要对Http的返回值做解析,可在使用from操作符时,传入一个解析器Parser 带进度上传 带进度上传使用uploadProgress操作符,并结合doOnNext.filter. ...

  7. RxHttp 完美适配Android 10/11 上传/下载/进度监听

    1.前言 随着Android 11的正式发布,适配Android 10/11 分区存储就更加的迫切了,因为Android 11开始,将强制开启分区存储,我们就无法再以绝对路径的方式去读写非沙盒目录下的 ...

  8. android横竖屏切换布局闪退,Android-Activity横竖屏切换不杀死Activity 并监听横竖屏切换...

    在上一篇博客,Android-Activity临时数据的保存,中讲解到,当发生横竖屏切换的时候,系统会杀死Activity并重新启动Activity 系统会杀死Activity 12-12 08:11 ...

  9. Android DownloadManager下载完成事件监听(系列4)

     Android DownloadManager下载完成事件监听(系列4) 我在之前写了写一些关于Android DownloadManager 的文章: (系列1)<Android大数据. ...

最新文章

  1. 解决SecureCRT 链接服务器 中文显示出现乱码【有图有真相】
  2. L301 L210 L101 L201 L110 R390 R270 R1430 1400清零软件 中文正版
  3. jQuery 中 jQuery(function(){})与(function(){})(jQuery) 的区别
  4. mysql mask from v2_MySQLDMB监控备份系统更新至v2.2
  5. 神奇的go语言(面向对象)
  6. 2016年第14本:毅力----如何培养自律的习惯(漫画版)
  7. 关于fineui中在gird中插入按钮的知识
  8. 使用BAPI批量修改采购信息记录的税率
  9. FlexSlider插件的详细设置参数
  10. 易语言高级表格如何右击选择当前项,再弹出右击菜单?
  11. Unity接入Steam成就
  12. 快速排序的C语言实现
  13. HDOJ 2504 又见GCD (水题)
  14. HashSet底层实现原理
  15. JavaScrapt朝花夕拾
  16. 关于数字化转型方法论的一些思考
  17. 什么是MVC和MVVC,以及它们的区别
  18. MODIS数据产品介绍
  19. 中国人太空行走的一天
  20. 笔试真题:100颗糖果,甲乙轮流从糖果盒中取出糖果,每次可取出2、4或6颗,若取得最后糖果的玩家为最终胜者,若甲先取z则(甲获胜,乙获胜,平局,不确定)

热门文章

  1. SSM框架(spring+springmvc+mybatis)+Mysql实现的社区物业管理系统(功能包含分角色,报修管理、抄表管理、车位管理、房屋管理、业主管理、投诉管理、报修统计分析等)
  2. 参与社团活动的意义_大学生参加社团有何作用,大学社团有哪些优点,看后或许能帮助你...
  3. 【办公类-16-05-04】“2022下学期 大班运动场地分配表-跳过节日循环排序”(python 排班表系列)
  4. PCB板有铅喷锡与无铅喷锡的区别?
  5. 开机显示器没显示,电源风扇显卡风扇都在转,键盘不亮
  6. 诈骗应用重卷AppStore
  7. 设计模式12-策略模式
  8. 哈工大计算机专业毕业论文,哈工大毕业论文格式模板.doc
  9. 新零售三大优势?精准定位用户需求
  10. PS5运行Linux,索尼发布新的驱动系统 PS5手柄可支持Linux系统玩家是使用