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

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

前言

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

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

下载

//文件存储路径

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> 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 down = RxHttp.get(url)

.asDownload(destPath);

downList.add(down);

}

//通过RxJava内部线程池,多任务并行下载

Observable.merge(downList)

.as(RxLife.as(this))

.subscribe(s -> {

//单个任务下载完成

}, throwable -> {

//下载出错

}, () -> {

//所有任务下载完成

});

复制代码

如果想监听每个任务的下载进度,也简单,用老方法即可,如下:

List> 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 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又能擦出怎样的火花。

转载请注明出处,谢谢🙏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/442363.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android中http断点下载,Android HttpURLConnection断点下载(单线程)

HttpCilent 跟 HttpURLConnection 是安卓原生的用来实现http请求的类&#xff1a;Android 6.0之后取消了HttpClient&#xff0c;不支持跟新 &#xff0c;今天小编使用的是HttpURLConnection &#xff1a;直接上代码&#xff1a;URL url null;BufferedInputStream bin null;Ht…

Android ui 单元测试 覆盖率,Android单元测试—UI测试(Espresso)

前言我们先回顾一下&#xff0c;在上一篇博客中&#xff0c;主要分享了Android单元测试的逻辑测试部分。接下来&#xff0c;我们重点讲解Android单元测试的UI测试部分&#xff01;何为UI测试呢&#xff1f;就是对用户界面的交互元素进行测试&#xff0c;如TextView、ImageView&…

android shape 圆角百分比,Android shape显示圆角问题

当需要定义一个圆角效果,当在ADT中预览,没有有效果时,只要运行就可以了&#xff01;xmlns:Android"http://schemas.android.com/apk/res/android">android:state_pressed"true">android:startColor"#ff8c00"android:endColor"#FFFFFF…

Android png模拟svg,Android 中使用svg图片

1. svg认识SVG&#xff1a;android5.0出现&#xff0c;w3c推出使用xml 描述二维图形语言,矢量图,放大缩小无影响为什么用svg,现在手机的短板是内存,不是cpu,svg通过cpu计算&#xff0c;png占用内存Android上对svg进行阉割&#xff0c;使用Vector Drawable对svg支持&#xff0c;…

android 删除垃圾文件夹,别再用手机管家清理垃圾了!删除这些文件夹,内存瞬间释放几个G...

随着手机使用时间的增加&#xff0c;手机中缓存的东西越来越多&#xff0c;这时候手机内存空间就会告急&#xff0c;从而影响手机的流畅性。那么在这种时候不要乱清理&#xff0c;我们只需要删除这几个文件夹&#xff0c;就可以帮手机轻松释放好几个G的内存。下面我们就一起来看…

android软件perthbus,Transit

v5.9.10版更新说明(2021-03-19)Whether you’re riding transit for business, pleasure, or to get shredded from a socially-spaced-out bus ballet, you’ll notice “Favourite destination” icons have been newly primped to prom perfection.What else? Hello Free2M…

HTML中scr是图片的什么,HTML中关于url、scr、href的区别

HTML中关于url、scr、href的区别URL是什么URL&#xff1a;Uniform Resource Locators(统一资源定位器)的简写&#xff0c;Web浏览器通过URL从Web服务器请求页面。url不是属性&#xff0c;src和href是属性&#xff0c;src用于替换当前元素&#xff0c;href用于在当前文档和引用资…

html5页面结构案例,前端学习笔记(五)HTML+CSS静态页面实战案例:幸福西饼首页和百度首页...

按照知乎上面汪小黑推荐的前端学习路径&#xff0c;在自学了HTML和CSS之后&#xff0c;开始尝试实战制作静态页面小项目。幸福西饼首页制作首先我在网上下载到了千锋教育提供的的幸福西饼官网静态页面的教学视频和图片素材、源码等。我是先看一集视频&#xff0c;然后关掉视频自…

计算机的应用技术课程的看法,统计教学与计算机应用的几点看法论文

统计教学与计算机应用的几点看法论文一、传统教学方法的局限性和弊端统计学是一门关于搜集、整理、汇总、描述和分析数据资料&#xff0c;并在此基础上进行推断和决策的方法论科学&#xff0c;具有很强的应用性、实践性。统计学课程是中等职业学校、财经类专业的基础核心课程。…

计算机应用基础试卷结果分析,计算机应用基础 试题

计算机应用基础 试题计算机应用基础的试题有哪些?打击知道吗?下面小编为大家带来计算机应用基础试题&#xff0c;仅供参考&#xff0c;希望能够帮到大家。计算机应用基础试题选择题:1、现代信息社会的主要标志是 ___ 。(A) 汽车的大量使用 (B) 人口的日益增长 (C) 自然环境的…

中国石油大学计算机专业调剂信息,2014年中国石油大学(北京)计算机专业考研调剂信息(新)...

写在前面&#xff1a;随着2014年34所自主划线院校考研分数线及国家线的公布&#xff0c;2014年考研复试、调剂工作也陆续拉开序幕。为了帮助更多考生顺利通过复试&#xff0c;考研论坛特开启复试调剂答疑活动&#xff0c;解答2014年考生有关考研复试和调剂的问题&#xff0c;为…

jupyter可以打开HTML文件吗,Jupyter ~ 像写文章般的 Coding (附:同一个ipynb文件,执行多语言代码)...

前面用了很久Notebook来交互式编程了&#xff0c;此次说说几个其余的选项&#xff1a;htmlNotebook Markdown此次选Markdown模式(关于Markdown基础能够看以前写的Markdown Base)python和代码同样&#xff0c;Shift回车就能够预览了&#xff0c;怎么样是否是很酷的感受&#xff…

计算机专业毕业论文指导记录详细,毕业论文指导记录怎么写 了解一下

1、指导记录总共6次&#xff0c;请各位同学按照法学院网站上公布的毕业论文写作进度确定每次指导记录的时间。同时根据自己的论文选题和实际情况&#xff0c;可稍作调整。2、第一次&#xff1a;根据学院的统一部署&#xff0c;布置学生毕业论文写作的总体要求与进度&#xff0c…

计算机专业会议评级,2018计算机专业工程教育认证研讨会

为帮助计算机专业了解我国工程教育认证进展、理解认证标准的本质、引导专业建立正确的认证观&#xff0c;落实以认证推进专业建设和完善内部质量保障体系、以认证工作推进一流专业建设&#xff0c;把认证和专业改革发展有机结合&#xff0c;提高计算机教学教育的质量。中国计算…

如何用计算机基础知识提问,职业学校《计算机应用基础》课的提问策略

【摘 要】《计算机应用基础》是中等职业学校的公共基础课&#xff0c;是一门融理论、技能、实训于一体的课程。本文简要分析《计算机应用基础》课的教学现状&#xff0c;通过对课堂教学现状的表现及原因的分析&#xff0c;从五个方便阐述职业学校《计算机应用基础》课的提问策略…

计算机网络技术基础教学内容,计算机网络技术基础

无计算机网络技术基础》课程教案一 计算机网络技术基础》课题&#xff1a; 课题&#xff1a;计算机网络概述(一) ) 教学顺序&#xff1a; 教学顺序&#xff1a;1 教学时数&#xff1a; 教学时数&#xff1a; 2 学时 教学目的&#xff1a;了解计算机网络产生的背景&#xff0c;掌…

淮阴工学院计算机答辩,淮阴工学院关于做好2014级研究生学位论文答辩工作的通知...

根据《淮阴工学院全日制工程硕士专业学位授予工作细则》(淮工院〔2013〕49号)(附件1)文件精神&#xff0c;淮阴工学院现将2014级研究生学位论文答辩相关工作事宜通知如下。下面&#xff0c;小编为大家分享淮阴工学院关于做好2014级研究生学位论文答辩工作的通知&#xff0c;全文…

计算机表格收入水平怎么算,怎么用excel计算工资所得税

利用Excel表格计算工资所得税?单位工资发放大多采用计算机管理,对一些小企业没有采用工资软件的,一般用Excel表来计算工资。下面小编就教你怎么用excel计算工资所得税。excel计算工资所得税的步骤&#xff1a;1、假设工资的所得税起征点为3500&#xff0c;具体阶段如下表。2、…

黔南民族师范学院计算机与信息学院,黔南民族师范学院

计算机与信息学院黔南民族师范学院计算机与信息学院成立于2000年9月&#xff0c;由原黔南师专计算机科学系、黔南教育学院微机培训中心、都匀民族师范学校计算机教研室组建而成。现下设系党政办公室、团委(学生工作办公室)、教务办公室、科研(学科建设)与研究生办公室、计算机实…

无法开启计算机,Win7下鼠标右键无法开启计算机属性怎么办?

Win7系统下&#xff0c;用户要查看计算机的属性&#xff0c;一般都会通过鼠标右键点击计算机图标&#xff0c;就会出现计算机属性的选项&#xff0c;这样就能快速地进入属性查看。但最近有用户遇到奇怪的现象&#xff0c;Win7下&#xff0c;用鼠标右键去开启计算机属性的时候运…