Android OkHttp+RxJava 史上最优雅的实现文件上传/下载进度的监听
本文已授权「刘望舒」微信公众号独家原创发布
前言
本文将直接使用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 史上最优雅的实现文件上传/下载进度的监听相关推荐
- android上传图片文件至c 服务器,Android 史上最优雅的实现文件上传、下载及进度的监听...
本文已授权「刘望舒」微信公众号独家原创发布 前言 本文将直接使用RxHttp库实现文件上传.下载.断点下载.进度的监听,不对RxHttp做过多讲解,如果对RxHttp不了解,请移步 本文目的在于让更多 ...
- png文件头_Android 史上最优雅的实现文件上传、下载及进度的监听
作者丨Android技术干货分享https://www.jianshu.com/p/d643f5a8fead 前言 本文将直接使用RxHttp库实现文件上传.下载.断点下载.进度的监听,不对RxHtt ...
- Android-史上最优雅的实现文件上传、下载及进度的监听,android自定义控件开发入门与实战
注:如果需要对Http的返回值做解析,可在使用uploadProgress操作符时,传入一个解析器Parser 下载 //文件存储路径 String destPath = getExternalCac ...
- Android-史上最优雅的实现文件上传、下载及进度的监听,网易严选Android开发三面面经
.add("key", "value") .add("file1", new File("xxx/1.png")) // ...
- Android-史上最优雅的实现文件上传、下载及进度的监听,androidrom开发面试题
RxHttp.postForm("http://-") //发送Form表单形式的Post请求 .add("key", "value") . ...
- Android-史上最优雅的实现文件上传、下载及进度的监听,flutter热更新方案
}); 注:如果需要对Http的返回值做解析,可在使用from操作符时,传入一个解析器Parser 带进度上传 带进度上传使用uploadProgress操作符,并结合doOnNext.filter. ...
- RxHttp 完美适配Android 10/11 上传/下载/进度监听
1.前言 随着Android 11的正式发布,适配Android 10/11 分区存储就更加的迫切了,因为Android 11开始,将强制开启分区存储,我们就无法再以绝对路径的方式去读写非沙盒目录下的 ...
- android横竖屏切换布局闪退,Android-Activity横竖屏切换不杀死Activity 并监听横竖屏切换...
在上一篇博客,Android-Activity临时数据的保存,中讲解到,当发生横竖屏切换的时候,系统会杀死Activity并重新启动Activity 系统会杀死Activity 12-12 08:11 ...
- Android DownloadManager下载完成事件监听(系列4)
Android DownloadManager下载完成事件监听(系列4) 我在之前写了写一些关于Android DownloadManager 的文章: (系列1)<Android大数据. ...
最新文章
- 解决SecureCRT 链接服务器 中文显示出现乱码【有图有真相】
- L301 L210 L101 L201 L110 R390 R270 R1430 1400清零软件 中文正版
- jQuery 中 jQuery(function(){})与(function(){})(jQuery) 的区别
- mysql mask from v2_MySQLDMB监控备份系统更新至v2.2
- 神奇的go语言(面向对象)
- 2016年第14本:毅力----如何培养自律的习惯(漫画版)
- 关于fineui中在gird中插入按钮的知识
- 使用BAPI批量修改采购信息记录的税率
- FlexSlider插件的详细设置参数
- 易语言高级表格如何右击选择当前项,再弹出右击菜单?
- Unity接入Steam成就
- 快速排序的C语言实现
- HDOJ 2504 又见GCD (水题)
- HashSet底层实现原理
- JavaScrapt朝花夕拾
- 关于数字化转型方法论的一些思考
- 什么是MVC和MVVC,以及它们的区别
- MODIS数据产品介绍
- 中国人太空行走的一天
- 笔试真题:100颗糖果,甲乙轮流从糖果盒中取出糖果,每次可取出2、4或6颗,若取得最后糖果的玩家为最终胜者,若甲先取z则(甲获胜,乙获胜,平局,不确定)
热门文章
- SSM框架(spring+springmvc+mybatis)+Mysql实现的社区物业管理系统(功能包含分角色,报修管理、抄表管理、车位管理、房屋管理、业主管理、投诉管理、报修统计分析等)
- 参与社团活动的意义_大学生参加社团有何作用,大学社团有哪些优点,看后或许能帮助你...
- 【办公类-16-05-04】“2022下学期 大班运动场地分配表-跳过节日循环排序”(python 排班表系列)
- PCB板有铅喷锡与无铅喷锡的区别?
- 开机显示器没显示,电源风扇显卡风扇都在转,键盘不亮
- 诈骗应用重卷AppStore
- 设计模式12-策略模式
- 哈工大计算机专业毕业论文,哈工大毕业论文格式模板.doc
- 新零售三大优势?精准定位用户需求
- PS5运行Linux,索尼发布新的驱动系统 PS5手柄可支持Linux系统玩家是使用