android EasyRxRetrofit封装(包括上传下载及进度监听)

Retrofit2+okhttp3的上传body进度回调 Retrofit2+okhttp3的上传body进度回调 UploadFileRequestBody.java 使用: 阅读详情

转载请注明出处:http://blog.youkuaiyun.com/anyfive/article/details/73469365

前言

很久以前封装过一次RxJava+Retrofit,最近想着把文件上传的进度监听、文件下载及进度监听加入进去。由于之前的封装太过匆忙,可用性太低,所以重新封装了一个,令其可真正使用于实际项目中,命名为EasyRxRetrofit,使用RxJava2.X+Retrofit2.X。

在本文,我将介绍EasyRxRetrofit的使用方式。

使用


依赖

implementation 'com.jimi_wu:EasyRxRetrofit:2.0.0'

在你的application中注册

@Override
public void onCreate() {
    super.onCreate();
//  在此处初始化Retrofit
    RetrofitManager.init(new YourRetrofitBuilder());
}

创建你的返回数据基类

EasyRxRetrofit封装了对返回数据的统一处理,你需要创建你自己的返回数据基类,并实现BaseModel接口的三个方法:

  • isError(): 返回请求是否出错;
  • getMsg():返回错误信息;
  • getResult():返回请求成功的数据。

比如,如果你的返回格式为

{
    code: 200,
    errMsg: "success",
    data: {...}
}

那么,你的返回数据基类应该为

public class ResultBean<T> implements BaseModel<T> {

    private int code;
    private String errMsg;
    private T data;

    @Override
    public boolean isError() {return code != 200;}
    
    @Override
    public String getMsg() {return errMsg;}

    @Override
    public T getResult() {return data;}

    /** getter and setter*/
    ...
}

提醒:基类记得使用泛型

调用get/post请求

要调用get/post请求,你首先需要创建自己的ApiService,跟你使用retrofit时一样,只是返回类型必须为Observable<ResultBean<T>>,其中ResultBean是你创建的返回数据基类:

public interface GetUserService {

    @POST("/getUser")
    Observable<ResultBean<UserBean>> start();

}

然后,执行你的请求,调用.compose(RetrofitManager.<T>handleResult())来实现返回数据的处理,并使用BaseObserver来订阅结果,如:

RetrofitManager
        .createService(GetUserService.class)
        .start()
        .compose(RetrofitManager.<UserBean>handleResult())
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new BaseObserver<UserBean>(this) {

            @Override
            protected void _onNext(UserBean userBean) {
                Log.i("retrofit", "onNext=========>" + userBean.getName());
                tv.setText("请求成功:" + userBean.getName());
            }

            @Override
            protected void _onError(Throwable e) {
                Log.i("retrofit", "onError=========>" + e.getMessage());
                tv.setText("请求失败:" + e.getMessage());
            }
        });

上传单个/多个文件,监听上传进度

上传文件不需自己创建ApiService,只需新建UploadParam对象,然后调用RetrofitManager.uploadFile方法,传入接口地址和UploadParam对象即可。

uploadFile方法有两个定义:

uploadFile(String url, UploadParam... params);
uploadFile(String url, List<UploadParam> params);

因此,上传单个文件与上传多个文件的方法是相同的:

// 上传单个文件
RetrofitManager.uploadFile(Constants.UPLOAD_URL, new UploadParam("upload", file))
// 上传多个文件
RetrofitManager.uploadFile(Constants.UPLOAD_URL, 
                           new UploadParam("upload", file1), 
                           new UploadParam("upload", file2));
// 使用List上传多个文件
ArrayList<UploadParam> uploadParams = new ArrayList<>(files.size());
for (File file : files) {
    uploadParams.add(new UploadParam("upload", file));
}
RetrofitManager.uploadFile(Constants.UPLOADS_URL, uploadParams);

需要注意的是,上传文件需要使用UploadObserver来订阅:

ArrayList<UploadParam> uploadParams = new ArrayList<>(files.size());
for (File file : files) {
    uploadParams.add(new UploadParam("upload", file));
}
RetrofitManager
        .uploadFile(Constants.UPLOADS_URL, uploadParams)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new UploadObserver<ResultBean<ArrayList<FileBean>>>() {

            @Override
            public void _onNext(ResultBean<ArrayList<FileBean>> arrayListResultBean) {
                ArrayList<FileBean> fileBeans = arrayListResultBean.getData();
                StringBuilder stringBuilder = new StringBuilder();
                for (FileBean fileBean : fileBeans) {
                    stringBuilder.append("上传成功:" + fileBean.getUrl() + "\n");
                }
                Log.d("retrofit", "onNext=======>" + stringBuilder);
                tv.setText("上传成功:" + stringBuilder);
            }

            @Override
            public void _onProgress(Integer percent) {
                Log.i("retrofit", "onProgress=======>" + percent);
                tv.setText("上传中:" + percent);
            }
            
            @Override
            public void _onProgress(long uploaded, long sumLength) {
                tvActualProgress.setText("下载中:" + uploaded + "/" + sumLength);
            }

            @Override
            public void _onError(Throwable e) {
                Log.d("retrofit", "onError======>" + e.getMessage());
                tv.setText("上传失败:" + e.getMessage());
            }
        });

其中_onProgress(Integer percent)方法回调百分比进度,_onProgress(long uploaded, long sumLength)方法回调文件长度进度,这两个方法并非抽象方法,因此可按需选择监听或不监听。

结果如下:

06-20 10:52:49.095 32377-32377/com.jimi_wu.sample I/retrofit: onProgress=======>95
06-20 10:52:49.095 32377-32377/com.jimi_wu.sample I/retrofit: onProgress=======>96
06-20 10:52:49.116 32377-32377/com.jimi_wu.sample I/retrofit: onProgress=======>97
06-20 10:52:49.117 32377-32377/com.jimi_wu.sample I/retrofit: onProgress=======>98
06-20 10:52:49.118 32377-32377/com.jimi_wu.sample I/retrofit: onProgress=======>99
06-20 10:52:49.118 32377-32377/com.jimi_wu.sample I/retrofit: onProgress=======>100
06-20 10:52:49.160 32377-32377/com.jimi_wu.sample I/retrofit: onNext=======>上传成功:http://192.168.5.127:3000/uploads/wx_camera_1497846596539.jpg
                                                              上传成功:http://192.168.5.127:3000/uploads/wx_camera_1497774775994.jpg
                                                              上传成功:http://192.168.5.127:3000/uploads/wx_camera_1497774700027.jpg

文件下载,监听下载进度

与上传文件类似,下载文件只需调用RetrofitManager.download("")方法,并使用DownLoadObserver订阅即可:

RetrofitManager
        .download("/uploads/test.pdf")
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new DownLoadObserver() {
            @Override
            public void _onNext(String result) {
                Log.i("retrofit", "onNext=======>" + result);
                tv.setText("下载成功:" + result);
            }

            @Override
            public void _onProgress(Integer percent) {
                Log.i("retrofit", "onProgress=======>" + percent);
                tv.setText("下载中:" + percent);
            }

            @Override
            public void _onProgress(long uploaded, long sumLength) {
                tvActualProgress.setText("下载中:" + uploaded + "/" + sumLength);
            }

            @Override
            public void _onError(Throwable e) {
                Log.i("retrofit", "onProgress=======>" + e.getMessage());
                tv.setText("下载失败:" + e.getMessage());
            }
        });

当然,你也可以使用 download(String url, String savePath, String fileName) 来设置下载的保存路径和文件名。

EasyRxRetrofit内部在下载文件时,会使用.tmp后缀作为临时文件名,待下载完成后再重命名为真正的名字。与上传一样,DownLoadObserver内部也含有两个_onProgress回调,可按需监听或不监听。

结果如下:

06-20 10:54:01.590 32377-32377/com.jimi_wu.sample I/retrofit: onProgress=======>95
06-20 10:54:01.686 32377-32377/com.jimi_wu.sample I/retrofit: onProgress=======>96
06-20 10:54:01.793 32377-32377/com.jimi_wu.sample I/retrofit: onProgress=======>97
06-20 10:54:01.884 32377-32377/com.jimi_wu.sample I/retrofit: onProgress=======>98
06-20 10:54:01.985 32377-32377/com.jimi_wu.sample I/retrofit: onProgress=======>99
06-20 10:54:02.086 32377-32377/com.jimi_wu.sample I/retrofit: onProgress=======>100
06-20 10:54:02.100 32377-32377/com.jimi_wu.sample I/retrofit: onNext=======>/storage/emulated/0/Download/VID_20170616_122618.mp4

说明

  • 可通过实现RetrofitBuilder接口返回Retrofit实例,管理各项配置。
  • EasyRxRetrofit内部不会进行线程切换,需手动按需切换。
  • EasyRxRetrofit内部未包含生命周期类的管理,需手动管理。

github: https://github.com/whichname/EasyRxRetrofit

欢迎各位star或提issue。

Android网络开源库-Retrofit(二) 文件上传、下载及进度监听 1.写在前面的话首先说明,我还没太搞懂retrofit,目前,这篇博客只能给出这几个内容。 文件上传 文件下载 文件下载的进度监听 还有这三点没弄好, 多文件一次上传 文件上传进度监听 当前使用版本compile 'com.squareup.retrofit2:retrofit:2.0.2'2. 文件上传2.1 api 接口编写public interface uploadfileApi { 阅读详情

相关推荐

Android网络开源库-Retrofit(三) 批量上传及上传进度监听

由于gif图太大的原因,我将图放在了github,如果博客中显示不出来图,传送门 由于我是事先写在md上的,导致代码的可读性差,大家将就着看吧。 1. 前言在上一篇博客中,我们介绍了Retrofit的文件上传,文件下载以及进度监听,这篇博客我们来了解下批量上传以及上传进度的监听。2.批量上传要想实现批量上传,我们要考虑下HTML中实现批量上传的方法,借助Form表单,所以,我们也可以通过借助Form

_StriveG的专栏 1万+

Android 使用Retrofit+协程实现超简单大文件下载并回显进度条

找到自己APP的包名点开进入下载目录,可以看到文件已经被下载到指定的位置。可以看到已经在下载了,下载完成后可以如图打开目录。在ApiService 中添加下载接口。创建弹窗工具类,使用刚才创建好的布局。,用到了挂起函数必须在协程中使用。编写具体调用下载接口的代码。先定义一个下载参数实体。别忘了加上网络请求权限。一个圆角白色背景样式。

工宗浩生财指南针 4324

Android-Retrofit2文件上传及其进度显示

Retrofit2 文件上传及其进度显示 只涉及 Retrofit RxJava 上传文件,像权限管理没有出来,毕竟只是演示多文件上传,显示进度

解决Retrofit文件下载进度显示问题

在Retrofit2.0使用详解这篇文章中详细介绍了retrofit的用法。并且在retrofit中我们可以通过ResponseBody进行对文件的下载。但是在retrofit中并没有为我们提供显示下载进度的接口。在项目中,若是用户下载一个文件,无法实时给用户显示下载进度,这样用户的体验也是非常差的。那么下面就介绍一下在retrofit用于文件的下载如何实时跟踪下载进度。

李江东 2万+

一文搞定3D卷积

在讨论卷积核的时候,是不把channel维加进去的 核 = 一个可以滑动的窗口 窗口内不同位置数据之间的权值共享 3D卷积,卷积核会在3个方向上运动,那么卷积核的运动需要有三个自由度(一小块立方体,在一个大面包块内3个方向上滑动 2D卷积,卷积核只在2个方向上运动,因此只有两个自由度(一小片纸,在一大张纸内2个方向上滑动 1D卷积,卷积核只在1个方向上运动,因此只有一个自由度(一条滑窗,在一大长线上1个方向上滑动 一个卷积核运算一次 得到一个输出值 以上讨论了单个卷积核,接下来考虑多通道,一个卷积核对应一

njuptalex的博客 3万+

C#计算八字

private string[] jq = { "小寒", "大寒", "立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏", "小满", "芒种", "夏至", "小暑", "大暑", "立秋", "处暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪", "冬至" };private string[] dz = { "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥", "子" };

m0_72939038的博客 828

Retrofit2.0使用姊妹篇——带进度下载文件

Retrofit是目前最主流的网络框架了,它对网络请求几近完美的封装,大大降低了我们开发者的研发难度,缩短了研发周期。最近项目中遇到了下载视频和图片文件的需求(还有上传视频和图片的需求,请移步这篇博客),我第一反应是用retrofit做呀,so easy!产品接着说,要带下载进度条哦!我一想,retrofit好像并没有给我们提供显示下载进度的接口,哎呀,看来还是得自己个儿整整喽!接下来,我把自己实...

Tybyqi的博客 314

数据科学常见模型总结(二)-倾向性得分匹配模型

PSM的核心思想是从未受干预的用户群体中,找到和干预对象一模一样的用户,这样就可以把因果效应归因到干预上。

wudelong0112的专栏 4893

Retrofit图片上传及进度的显示

一、关于图片上传以前接触过的图片上传,没有使用框架,是直接通过接口跟服务器交互的状态,先将图片转成base64String,然后添加到json当中,再通过接口发送给服务器,当时单张图片还好说,如果是多张而且大小不小的话,传输就相当慢了,现在接触到的retrofit,上传文件,当然包括图片,提供了自己的方法,上传单张和多张的速度很快,效率得到了大大的提升而;二、实现文件上传 接口的编写,是以p

Jacky_Can的博客 4034

深度学习暑期科研项目(两个月发EI论文)

对本科生而言,越早接触系统的科研训练开始上手科研项目,就越能在未来的升学求职中占据很大的优势。暑假是提升个人简历、丰富科研经历的最佳时期!哈尔滨工业大学博士师兄也会在8月1日开始带大家上手科研项目,并撰写发表EI会议论文。

Magnolia_He的博客 1443

从零到一:基于STM8的125KHz RFID读卡器实现与曼彻斯特码解析实战

本文详细介绍了基于STM8单片机的125KHz RFID读卡器实现过程,重点解析了曼彻斯特码的编码原理与解码算法。通过硬件电路设计、软件实现及性能优化,帮助开发者低成本构建稳定读取EM4100卡片的系统,适用于门禁、考勤等应用场景。

weixin_42525211的博客 236

Android-封装网络请求Retrofit+Rxjava可实现上传下载进度监听

1.添加依赖 build.gradle: //gson解析 api rootProject.ext.dependencies[“gson”] api rootProject.ext.dependencies[“retrofit”] //retrofit2.0 api rootProject.ext.dependencies[“adapter-rxjava2”] //配合Rxjava 使用 api ...

shiming_shi的博客 1663

免费替代Cursor!TRAE中文版这些隐藏功能90%的人不知道

本文深度评测了免费AI编程工具TRAE中文版,揭示其超越代码补全的隐藏功能。重点介绍了其SOLO模式如何重塑从需求到部署的全流程开发,以及对微信小程序、Taro、Ant Design Pro等国产技术栈的深度适配能力,为中文开发者提供了高度本地化的高效解决方案。

gray5的博客 840

基于RxJava2.0+Retrofit2.0超大文件分块(分片)上传(带进度)

当上传文件过大时,直接上传会增加服务器负载,负载过高会导致机器无法处理其他请求及操作,甚至导致宕机,这时分片上传是最佳选择。本次简单介绍两种分片上传文件方案(暂不考虑文件安全相关问题,如签名): 方案一:把单个文件切割成若干份,依次上传,最后由服务端合并 方案二:根据文件索引读取指定大小上传,服务器根据索引写入 ...

Kelly 3015

Unreal 从入门到进阶 之 如何实现Pixel Streaming

Unreal Engine 5 (UE5) 的 Pixel Streaming 是一项基于云端的实时流媒体技术,允许将 UE5 应用的高质量图形渲染结果通过 WebRTC 协议传输到用户的浏览器或轻量级设备,同时将用户输入(如鼠标、键盘、触控)回传到服务器处理。UE的插件相对比较好用,但是就是环境下载总是失败。希望这篇文章对你有所帮助。

TxNet 1369

STM32 stack_size和heap_size大小设置的意义

在使用STM32编程时,一般情况下我们不会关注堆栈空间的大小,因为在STM32的启动文件中,已经帮我们预先设置好了堆栈空间的大小。如下图所示的启动代码中,Stack栈的大小为:0x400(1024Byte),Heap堆的大小为:0x200(512Byte)。 1、若工程中使用的局部变量较多,定义的数据长度较大时,若不调整栈的空间大小,则会导致程序出现栈溢出,程序运行结果与预期的不符或程序跑飞。这时我们就需要手动的调整栈的大小。 2、当工程中使用了malloc动态分配内存空间时,这时分配.......

zxm8513优快云博客 3万+

Retrofit2的再封装实战—多线程下载与断点续传(三)

前面两篇文章我们讲了项目整体的设计结构、入口类DownloadManager、下载类DownloadTask,这篇文章我们讲最重要的类DownLoadRequest。由于离前两篇文章时间比较长了,感觉陌生的同学可以先回顾一下:Retrofit2的再封装实战—多线程下载与断点续传(一)Retrofit2的再封装实战—多线程下载与断点续传(二) 流程图 回忆之前文章提到的,我们将需要下载的任务构造成一...

weixin_33835103的博客 293

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Android Retrofit 封装模版

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档。

halong99的专栏 1340

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Retrofit2.0使用姊妹篇——带进度上传文件

之前的一篇博客讲了Retrofit带进度下载文件的实现,算是Retrofit使用的“姐姐篇”,那今天我们就讲讲它的“妹妹篇“——用Retrofit实现带进度上传文件! github地址:https://github.com/kb18519142009/UploadService.git 大家喜欢的话,就给个star^_^,有问题或者建议,可以直接提issues,也可以在博客下面给我留言。谢谢~...

k_bb_666的博客 8393

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Android --- Retrofit 上传/下载文件扩展实现进度的监听

本文使用okhttp作为client来做,其实说白了跟用okhttp做下载上传进度监听几乎一样,参考了这篇文章:Android OkHttp文件上传与下载的进度监听扩展 1. 首先我们写两个接口用来下载和上传的进度监听回调: /** * 请求体进度回调接口,用于文件上传进度回调 */ public interface ProgressRequestListener { void onRequestProgress(long bytesWritten, long contentLength, bo

梁同学与Android 1793

Retrofit(三)、使用Retrofit上传文件并带进度

在上一讲中 Retrofit(二)、使用Retrofit+OkHttp下载文件并带进度条 中,我们知道如何用Retrofit去下载文件并返回进度。细心的你会发现,其实Retrofit接口enqueue方法,最终也是调用了OkHttp的enqueue方法。这一讲,我们来实现通过Retrofit实现多文件上传并时时监听进度!一、服务器端在服务器端新增一个PostFileServlet的Servlet来接

Gary__123456的博客 4258

Retrofit上传下载文件及进度监听

#一.文件上传 1.文件上传注意点 1.文件上传一般用post请求 2.文件上传的API接口中不能带@FormUrlEncoded参数 3.一般要携带@Multipart(上传文件的标志) 2.接口示例 @Multipart @POST("UploadServlet") Call<String> uploadFile(@PartMap Map<String, RequestBody> params); 或者: @Multipart @POST("UploadServlet") Ca

XBlithe的博客 1069

android文件下载器(轻量级)——EasyFileDownload

EasyFileDownloaderA lightweight for use in the android file downloader Download the APK is especially suitable for application in upgradehttps://github.com/lijunhuayc/EasyFileDownloaderUsageversion 1.1

西北狼神 3949

开源项目 easydownload

一个用于下载的 android library库, 源码 支持多线程断点下载, 支持消息通知. 支持优先级下载. 支持暂停,继续,删除下载列表 支持多服务器下载. 使用方式 compile 'com.github.lisicnu:easyDownload:0.1.9' 调用方式.: 1. 初始化 DownloadPoorl.getInstance().init...

weixin_34026484的博客 111

使用Retrofit2.0上传文件,可以监听上传进度[客户端+服务器端代码]

闲话少说啊,最近项目随大流,用上了传说中的Retrofit进行网络交互,个人负责的模块上有个检测文件上传的进度【这里吐槽一下砸门办公室的网速真TM差,真想把PM打一顿】。以前使用的XUtils中有个方法自带了上传回调的方法,现在用了这个Retrofit,虽说网上有些人说过怎么检测,但大多没有什么代码,按照他们的说法,我好像没成功,自己来吧。对于Retrofit2.0本屌丝也是个新手,有些地方刚开始学

成长的烧年 1万+
上一篇: 微信小程序小笔记
下一篇: android 打造自己的gradle构建脚本(以集成Tinker为例)
Jimi_Wu
博客等级 码龄12年 40粉丝 16原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值