OkHttp是比较火的网络框架,它支持同步与异步请求,支持缓存,可以拦截,更方便下载大文件与上传文件的操作。下面我们用OkHttp来下载文件并带进度条!
<强>相关资料:强>
官网地址:http://square.github.io/okhttp/
github源码地址:https://github.com/square/okhttp
可以参考搭建本地Tomcat服务器及相关配置这篇文章。
新建项目OkHttpServer,在WebContent目录下新建downloadfile目录,将要下载的jpg文件放在项目下。如下图:
编译“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下载文件并带进度条