Android 史上最优雅的实现文件上传、下载及进度的监听,学海无涯

前言

本文将直接使用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-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 -> {
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

学习分享

在当下这个信息共享的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了

很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘

如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。

2021最新上万页的大厂面试真题

image

七大模块学习资料:如NDK模块开发、Android框架体系架构…

image

2021大厂面试真题:

image

只有系统,有方向的学习,才能在短时间内迅速提高自己的技术,只有不断地学习,不懈的努力才能拥有更好的技术,才能在互联网行业中立于不败之地。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

只有系统,有方向的学习,才能在短时间内迅速提高自己的技术,只有不断地学习,不懈的努力才能拥有更好的技术,才能在互联网行业中立于不败之地。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 12
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现 Python 文件上传并返回进度,可以使用 Python 的 socket 模块和 tqdm 库。 下面是一个基本的上传文件的示例代码: ```python import socket import os from tqdm import tqdm # 客户端连接信息 host = '127.0.0.1' port = 9999 # 创建 socket 对象 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接服务器 client_socket.connect((host, port)) # 要上传的文件路径 file_path = '/path/to/file' # 获取文件大小 file_size = os.path.getsize(file_path) # 发送文件名和大小 file_name = os.path.basename(file_path) client_socket.send(f"{file_name} {file_size}".encode()) # 打开文件并发送数据 with open(file_path, 'rb') as f: # 使用 tqdm 显示上传进度 progress_bar = tqdm(total=file_size, unit='B', unit_scale=True) while True: # 读取数据 data = f.read(1024) if not data: break # 发送数据 client_socket.send(data) # 更新进度条 progress_bar.update(len(data)) # 关闭连接 client_socket.close() ``` 在服务器端,可以使用类似的代码来接收上传的文件并显示进度: ```python import socket from tqdm import tqdm # 服务器信息 host = '127.0.0.1' port = 9999 # 创建 socket 对象 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定地址和端口 server_socket.bind((host, port)) # 监听客户端连接 server_socket.listen(1) # 接收客户端连接 client_socket, client_address = server_socket.accept() # 接收文件名和大小 file_info = client_socket.recv(1024).decode().split() file_name, file_size = file_info[0], int(file_info[1]) # 创建文件并接收数据 with open(file_name, 'wb') as f: # 使用 tqdm 显示下载进度 progress_bar = tqdm(total=file_size, unit='B', unit_scale=True) while True: # 接收数据 data = client_socket.recv(1024) if not data: break # 写入文件 f.write(data) # 更新进度条 progress_bar.update(len(data)) # 关闭连接 client_socket.close() server_socket.close() ``` 注意,这里的进度条是使用 tqdm 库实现的。需要使用 pip 安装 tqdm 库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值