改造+ RxJava已经是目前市场上最主流的网络框架,使用它进行平常的网络请求异常轻松,之前也用翻新做过上传文件和下载文件,但发现:使用翻新做下载默认是不支持进度回调的,但产品大大要求下载文件时显示下载进度,那就不得不深究下了。
接下来我们一起封装,使用改造+ RxJava实现带进度下载文件。
github: JsDownload
先来看看UML图:
编译的io.reactivex: rxjava: 1.1.0 编译的io.reactivex: rxandroid: 1.1.0 编译的com.squareup.retrofit2:改造:2.0.0-beta4 编译的com.squareup.retrofit2: converter-gson: 2.0.0-beta4 编译的com.squareup.retrofit2: adapter-rxjava: 2.0.0-beta4
使用时注意版本号
<强> 2,写回调强>
/* * *描述:下载进度回调 *由贾>/* * *描述:带进度下载请求体 *由贾>/* * *描述:带进度下载拦截器 *由贾>/* * *描述: *由贾>/* * 1. 描述:下载工具类 2. 由贾2017/11/30。 3.人之所以能,是相信能 */公开课DownloadUtils { 私有静态最终字符串标签=癉ownloadUtils”; 私有静态最终int DEFAULT_TIMEOUT=15; 私人改造改造; 私人JsDownloadListener侦听器; 私人字符串baseUrl; 私人字符串downloadUrl; 公共DownloadUtils(字符串baseUrl, JsDownloadListener侦听器){ 这一点。baseUrl=baseUrl; 这一点。侦听器=侦听器; JsDownloadInterceptor mInterceptor=new JsDownloadInterceptor(听众); OkHttpClient httpClient=new OkHttpClient.Builder () .addInterceptor (mInterceptor) .retryOnConnectionFailure(真正的) .connectTimeout (DEFAULT_TIMEOUT TimeUnit.SECONDS) .build (); 改造=new Retrofit.Builder () .baseUrl (baseUrl) .client (httpClient) .addCallAdapterFactory (RxJavaCallAdapterFactory.create ()) .build (); }/* * *开始下载 * * @param url * @param filePath * @param订阅者 */公共空间下载(@NonNull字符串url,最终字符串filePath,订户订阅){ listener.onStartDownload ();//subscribeOn()改变调用它之前代码的线程//observeOn()改变调用它之后代码的线程 retrofit.create (DownloadService.class) .download (url) .subscribeOn (Schedulers.io ()) .unsubscribeOn (Schedulers.io ()) . map(新Func1() { @Override 公共InputStream调用(ResponseBody ResponseBody) { 返回responseBody.byteStream (); } }) .observeOn (Schedulers.computation())//用于计算任务 .doOnNext(新的Action1 () { @Override 公共空间调用(InputStream InputStream) { writeFile (inputStream, filePath); } }) .observeOn (AndroidSchedulers.mainThread ()) .subscribe(订户); }/* * *将输入流写入文件 * * @param inputString * @param filePath */私人空间writeFile (InputStream inputString字符串filePath) { 文件文件=新文件(filePath); 如果(file.exists ()) { file.delete (); } FileOutputStream安全系数=零; 尝试{ 安全系数=new FileOutputStream(文件); byte [] b=新的字节[1024]; int len; 在((len=inputString.read (b)) !=1) { fos.write (b, 0, len); } inputString.close (); fos.close (); }捕捉(FileNotFoundException e) { listener.onFail (“FileNotFoundException”); }捕捉(IOException e) { listener.onFail (IOException); } } } >之前 <李>在构造中将下载地址和最后回调传入,当然,也可以将保存地址传入;李> <李>在OkHttpClient添加我们自定义的拦截器;李> <李>注意.addCallAdapterFactory (RxJavaCallAdapterFactory.create())支持RxJava;李> <李>使用RxJava地图的方法将responseBody转为输入流;李> <李>在doOnNext中将输入流写入文件;
李>当然也需要注意下载回调的各个位置。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
改造+ RxJava实现带进度下载文件