android中实现OkHttp下载文件并带进度条

  

OkHttp是比较火的网络框架,它支持同步与异步请求,支持缓存,可以拦截,更方便下载大文件与上传文件的操作。下面我们用OkHttp来下载文件并带进度条!

  

<强>相关资料:
  

  

官网地址:http://square.github.io/okhttp/

  

github源码地址:https://github.com/square/okhttp

  

  

可以参考搭建本地Tomcat服务器及相关配置这篇文章。

  

新建项目OkHttpServer,在WebContent目录下新建downloadfile目录,将要下载的jpg文件放在项目下。如下图:

  

 android中实现OkHttp下载文件并带进度条”>,</p>
  <p>启动服务器,文件下载地址为http://localhost: 8080/OkHttpServer/下载/2. jpg。这样我们服务器就搭好了。</p>
  <p> </p>
  <p>下面我们进入正题。</p>
  <p> 1. build.gradle的依赖性配置如下</p>
  
  <pre类=   编译“com.android.support: appcompat-v7:24.1.1”   编译的com.squareup.okhttp3: okhttp: 3.2.0   编译的com.squareup.okio: okio: 1.7.0      

2. activity_main.xml         & lt; & # 63; xml version=" 1.0 " encoding=" utf - 8 " & # 63;比;   & lt; RelativeLayout xmlns: android=" http://schemas.android.com/apk/res/android "   xmlns:工具=" http://schemas.android.com/tools "   android: layout_width=" match_parent "   android: layout_height=" match_parent "   android: paddingBottom=" @dimen/activity_vertical_margin”   android: paddingLeft=" @dimen/activity_horizontal_margin”   android: paddingRight=" @dimen/activity_horizontal_margin”   android: paddingTop=" @dimen/activity_vertical_margin”   工具:上下文=癱om.huang.myokhttp.MainActivity”比;         & lt;按钮   android: id=癅 + id/ok_download”   android: layout_width=" match_parent "   android: layout_height=" wrap_content "   android:文本="下载文件”/比;         & lt; TextView   android: id=癅 + id/download_text”   android: layout_width=" match_parent "   android: layout_height=" wrap_content "   android:重力="中心"   android:文本=" 0 "/比;         & lt; ProgressBar   android: id=癅 + id/download_progress”      android: layout_width=" match_parent "   android: layout_height=" wrap_content "   android: max=" 100 "/比;         & lt;/RelativeLayout>      之前      

3。编写OkHttpUtil如下:

        私有静态OkHttpClient OkHttpClient=new OkHttpClient.Builder ()。TimeUnit.MILLISECONDS connectTimeout (10000)   TimeUnit.MILLISECONDS .readTimeout (10000)   TimeUnit.MILLISECONDS .writeTimeout (10000) .build ();//下载文件方法   公共静态孔隙downloadFile(字符串url,最终ProgressListener侦听器,回调的回调){//增加拦截器   OkHttpClient客户=okHttpClient.newBuilder ()。addNetworkInterceptor(新的拦截器(){   @Override   公开回应拦截(链链)抛出IOException {   响应响应=chain.proceed (chain.request ());   返回response.newBuilder ()。身体(新ProgressResponseBody (response.body(),侦听器)).build ();   }   }).build ();      请求请求=new Request.Builder () .url (url) .build ();   client.newCall(请求).enqueue(回调);   }   之前      

4。上面代码中的ProgressResponseBody是自己编写的类,ProgressListener是监听的接口:
  

  

ProgressListener接口         公共接口ProgressListener {//已完成的总的文件长度是否完成   空白>   公开课ProgressResponseBody延伸ResponseBody {   公共静态最终int更新=0 x01;   公共静态最终字符串标签=ProgressResponseBody.class.getName ();   私人ResponseBody ResponseBody;   私人ProgressListener mListener;   私人BufferedSource BufferedSource;   私人处理器myHandler;   公共ProgressResponseBody (ResponseBody身体,ProgressListener侦听器){   responseBody=身体;   mListener=侦听器;   如果(myHandler==null) {   myHandler=new myHandler ();   }   }/* *   *将进度放到主线程中显示   */MyHandler扩展处理程序类{      公共MyHandler () {   超级(Looper.getMainLooper ());   }      @Override   公共空间handleMessage(消息味精){   开关(msg.what) {   情况更新:   ProgressModel ProgressModel=(ProgressModel) msg.obj;//接口返回   如果(mListener !=null) mListener.onProgress (progressModel.getCurrentBytes (), progressModel.getContentLength (), progressModel.isDone ());   打破;      }   }   }      @Override   公共MediaType contentType () {   返回responseBody.contentType ();   }      @Override   公共长contentLength () {   返回responseBody.contentLength ();   }      @Override   公共BufferedSource源(){      如果(bufferedSource==null) {   bufferedSource=Okio.buffer (mySource (responseBody.source ()));   }   返回bufferedSource;   }      私人来源mySource(源来源){      返回新ForwardingSource(源){   长totalBytesRead=0 l;   @Override   公共长阅读(缓冲水池,长byteCount)抛出IOException {   长bytesRead=超级。读(水槽,byteCount);   totalBytesRead +=bytesRead !=1 & # 63; bytesRead: 0;//发送消息到主线程,ProgressModel为自定义实体类   消息味精=Message.obtain ();   味精。什么=更新;   味精。obj=new ProgressModel (totalBytesRead contentLength (), totalBytesRead==contentLength ());   myHandler.sendMessage(味精);      返回bytesRead;   }   };   }   }      

android中实现OkHttp下载文件并带进度条