改造+ RxJava实现带进度下载文件

  

改造+ RxJava已经是目前市场上最主流的网络框架,使用它进行平常的网络请求异常轻松,之前也用翻新做过上传文件和下载文件,但发现:使用翻新做下载默认是不支持进度回调的,但产品大大要求下载文件时显示下载进度,那就不得不深究下了。

  

接下来我们一起封装,使用改造+ RxJava实现带进度下载文件。

  

github: JsDownload   

先来看看UML图:

  

改造+ RxJava实现带进度下载文件”>大家可能还不太清楚具体是怎么处理的,别急,我们一步步来:</p>
  <p> <强> 1,添依赖是必须的啦</强> </p>
  
  <pre类=   编译的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实现带进度下载文件