android EasyRxRetrofit封装(包括上传下载及进度监听)
来源:互联网 发布:网络打印机 脱机 编辑:程序博客网 时间:2024/06/18 05:15
转载请注明出处:http://blog.csdn.net/anyfive/article/details/73469365
前言
很久以前封装过一次RxJava+Retrofit,最近想着把文件上传的进度监听、文件下载及进度监听加入进去。由于之前的封装太过匆忙,可用性太低,所以重新封装了一个,令其可真正使用于实际项目中,命名为EasyRxRetrofit,使用RxJava2.X+Retrofit2.X。
在本文,我将介绍EasyRxRetrofit的使用方式。
使用
依赖
compile 'com.jimi_wu:EasyRxRetrofit:1.0.0'
在你的application中注册
@Overridepublic void onCreate() { super.onCreate();// 在此处初始化Retrofit RetrofitManager .getInstance() .setAgent("agent")//设置agent .init(this);}
创建你的返回数据基类
EasyRxRetrofit封装了对返回数据的统一处理,你需要创建你自己的返回数据基类,并实现BaseModel接口的四个方法:
- isError(): 返回请求是否出错;
- getErrorCode():返回错误代码;
- 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 int getErrorCode() {return code;} @Override public String getMsg() {return errMsg;} @Override public T getResult() {return data;} /** getter and setter*/ ...}
提醒:基类记得使用泛型
调用get/post请求
要调用get/post请求,你首先需要创建自己的ApiService,
跟你使用retrofit时一样,只是返回类型必须为“Flowable
public interface GetUserService { @POST("/getUser") Flowable<ResultBean<UserBean>> start();}
然后,执行你的请求,调用.compose(RetrofitUtils.handleResult())来实现返回数据的处理,以及线程的切换,并使用EasySubscriber来订阅结果,如:
RetrofitUtils .createService(GetUserService.class) .start() .compose(RetrofitUtils.<UserBean>handleResult()) .subscribe(new EasySubscriber<UserBean>(this) { @Override protected void _onNext(UserBean userBean) { Log.i("retrofit", "onNext=========>" + userBean.getName()); tv.setText("请求成功:"+userBean.getName()); } @Override protected void _onError(int errorCode, String msg) { Log.i("retrofit", "onError=========>" + msg); tv.setText("请求失败:"+msg); } });
上传单个文件,监听上传进度
上传文件与发送get/post请求类似,首先,需要创建你的ApiService,如:
public interface FileUploadService { @Multipart @POST("/upload") Flowable<ResultBean<FileBean>> upload(@Part MultipartBody.Part file);}
注意,必须声明Multipart格式,同时,第一个参数必须为“@Part MultipartBody.Part”。
然后,调用上传方法uploadFile(),将ApiService与ApiService内上传请求的方法名传入,这是因为uploadFile方法内部使用了反射来创建真正的上传请求。
最后,使用UploadSubscriber来监听上传的进度及结果。
如:
RetrofitUtils .uploadFile(file, FileUploadService.class, "upload") .safeSubscribe(new UploadSubscriber<FileBean>(this) { @Override protected void _onNext(FileBean result) { Log.i("retrofit", "onNext=======>url:"+result.getUrl()); tv.setText("上传成功:"+result.getUrl()); } @Override protected void _onProgress(Integer percent) { Log.i("retrofit", "onProgress======>"+percent); tv.setText("上传中:"+percent); } @Override protected void _onError(int errorCode, String msg) { Log.i("retrofit", "onError======>"+msg); tv.setText("上传失败:"+msg); } });
结果如下:
06-20 10:39:58.974 32377-32377/com.jimi_wu.sample I/retrofit: onProgress======>9506-20 10:39:58.975 32377-32377/com.jimi_wu.sample I/retrofit: onProgress======>9606-20 10:39:58.978 32377-32377/com.jimi_wu.sample I/retrofit: onProgress======>9706-20 10:39:58.981 32377-32377/com.jimi_wu.sample I/retrofit: onProgress======>9806-20 10:39:58.993 32377-32377/com.jimi_wu.sample I/retrofit: onProgress======>9906-20 10:39:58.994 32377-32377/com.jimi_wu.sample I/retrofit: onProgress======>10006-20 10:39:59.020 32377-32377/com.jimi_wu.sample I/retrofit: onNext=======>url:http://192.168.5.127:3000/uploads/wx_camera_1497773556658.mp4
上传多个文件,监听上传进度
多文件上传与单文件上传是类似的,只是ApiService稍有不同:
public interface FilesUploadService { @Multipart @POST("/uploads") Flowable<ResultBean<ArrayList<FileBean>>> uploads(@Part ArrayList<MultipartBody.Part> files);}
可以看到,多文件上传需要定义参数为“@Part ArrayList
RetrofitUtils .uploadFiles(files, FilesUploadService.class, "uploads") .safeSubscribe(new UploadSubscriber<ArrayList<FileBean>>(this) { @Override protected void _onNext(ArrayList<FileBean> result) { StringBuilder stringBuilder = new StringBuilder(); for (FileBean fileBean : result) { stringBuilder.append("上传成功:"+fileBean.getUrl()+"\n"); } Log.i("retrofit", "onNext=======>"+stringBuilder); tv.setText("上传成功:"+stringBuilder); } @Override protected void _onProgress(Integer percent) { Log.i("retrofit", "onProgress=======>"+percent); tv.setText("上传中:"+percent); } @Override protected void _onError(int errorCode, String msg) { Log.i("retrofit", "onError======>"+msg); tv.setText("上传失败:"+msg); } });
结果如下:
06-20 10:52:49.095 32377-32377/com.jimi_wu.sample I/retrofit: onProgress=======>9506-20 10:52:49.095 32377-32377/com.jimi_wu.sample I/retrofit: onProgress=======>9606-20 10:52:49.116 32377-32377/com.jimi_wu.sample I/retrofit: onProgress=======>9706-20 10:52:49.117 32377-32377/com.jimi_wu.sample I/retrofit: onProgress=======>9806-20 10:52:49.118 32377-32377/com.jimi_wu.sample I/retrofit: onProgress=======>9906-20 10:52:49.118 32377-32377/com.jimi_wu.sample I/retrofit: onProgress=======>10006-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
文件下载,监听下载进度
文件下载并不需要你创建自己的ApiService,你只需要调用downLoadFile方法,传入文件地址,并使用DownLoadSubscriber监听下载进度与下载结果就可以了,如:
RetrofitUtils .downLoadFile("/uploads/VID_20170616_122618.mp4") .safeSubscribe(new DownLoadSubscriber(this) { @Override protected void _onNext(String result) { Log.i("retrofit", "onNext=======>"+result); tv.setText("下载成功:"+result); } @Override protected void _onProgress(Integer percent) { Log.i("retrofit", "onProgress=======>"+percent); tv.setText("下载中:"+percent); } @Override protected void _onError(int errorCode, String msg) { Log.i("retrofit", "onProgress=======>"+msg); tv.setText("下载失败:"+msg); } });
当然,你也可以使用
downLoadFile(String url, String savePath, String fileName)
来设置下载的保存路径和文件名。
结果如下:
06-20 10:54:01.590 32377-32377/com.jimi_wu.sample I/retrofit: onProgress=======>9506-20 10:54:01.686 32377-32377/com.jimi_wu.sample I/retrofit: onProgress=======>9606-20 10:54:01.793 32377-32377/com.jimi_wu.sample I/retrofit: onProgress=======>9706-20 10:54:01.884 32377-32377/com.jimi_wu.sample I/retrofit: onProgress=======>9806-20 10:54:01.985 32377-32377/com.jimi_wu.sample I/retrofit: onProgress=======>9906-20 10:54:02.086 32377-32377/com.jimi_wu.sample I/retrofit: onProgress=======>10006-20 10:54:02.100 32377-32377/com.jimi_wu.sample I/retrofit: onNext=======>/storage/emulated/0/Download/VID_20170616_122618.mp4
github: https://github.com/whichname/EasyRxRetrofit
欢迎各位star或提issue。
- android EasyRxRetrofit封装(包括上传下载及进度监听)
- 【封装】使用okHttp发送网络请求及上传下载进度监听
- retrofit2+okhttp3图片上传及进度监听
- 文件上传下载及自己封装jar包
- Android网络开源库-Retrofit(二) 文件上传、下载及进度监听
- Android网络开源库-Retrofit(三) 批量上传及上传进度监听
- Android WebView加载网页进度监听
- android 网络加载提示进度封装 View
- android Home键监听封装
- 封装了okhttp的网络框架,支持大文件上传下载,上传进度...
- RecyclerView.Adapter封装,包括点击监听,长按监听,继承时不需要重新设置
- Android OkHttp文件上传与下载的进度监听扩展
- Android OkHttp文件上传与下载的进度监听扩展
- Android OkHttp文件上传与下载的进度监听扩展
- Android OkHttp文件上传与下载的进度监听扩展
- Android OkHttp文件上传与下载的进度监听扩展
- android中DownloadManager实现版本更新,监听下载进度实例
- UIProgressView实时展示上传下载进度
- html长英文换行
- iOS XCode 编译按钮 clean 灰色 不能点击
- 文件上传与下载--servlet版本上传
- MySQL高级 之 锁
- Win10(64bit)+Emgu CV3.0.0+VS2013 下载&安装&配置
- android EasyRxRetrofit封装(包括上传下载及进度监听)
- AUC计算方法总结
- 黑色帽子
- eclips plugin插件开发入门
- win7 Python3 安装mayavi 记录
- 微信开发前言
- Vue.js前端开发实战指南 -- Keepalive
- c++实现基本栈造作
- 【易初电商】全网营销核心价值