Retrofit+RxJava已经是目前市场上最主流的网络框架,使用它进行平常的网络请求异常轻松,之前也用Retrofit做过上传文件和下载文件,但发现:使用Retrofit做下载默认是不支持进度回调的,但产品大大要求下载文件时显示下载进度,那就不得不深究下了。
接下来我们一起封装,使用Retrofit+RxJava实现带进度下载文件。
github:https://github.com/shuaijia/JsDownload
先来看看UML图:
大家可能还不太清楚具体是怎么处理的,别急,我们一步步来:
1、添依赖是必须的啦
compile 'io.reactivex:rxjava:1.1.0'
compile 'io.reactivex:rxandroid:1.1.0'
compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4'
使用时注意版本号
2、写回调
/**
* Description: 下载进度回调
* Created by jia on 2017/11/30.
* 人之所以能,是相信能
*/
public interface JsDownloadListener {
void onStartDownload();
void onProgress(int progress);
void onFinishDownload();
void onFail(String errorInfo);
}
这里就不用多说了,下载的回调,就至少应该有开始下载、下载进度、下载完成、下载失败 四个回调方法。
注意下在onProgress方法中返回进度百分比,在onFail中返回失败原因。
3、重写ResponseBody,计算下载百分比
/**
* Description: 带进度 下载请求体
* Created by jia on 2017/11/30.
* 人之所以能,是相信能
*/
public class JsResponseBody extends ResponseBody {
private ResponseBody responseBody;
private JsDownloadListener downloadListener;
// BufferedSource 是okio库中的输入流,这里就当作inputStream来使用。
private BufferedSource bufferedSource;
public JsResponseBody(ResponseBody respons