收藏官网首页
查看: 13002|回复: 0

[IT大杂烩] okhttp上传并且显示进度

45

主题

92

帖子

507

积分

高级会员

Rank: 4

积分
507
跳转到指定楼层
楼主
发表于 2017-2-15 10:38:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
注册成为机智云开发者,手机加虚拟设备快速开发
本帖最后由 Genius 于 2017-2-15 11:01 编辑

okhttp非常好的一个http请求框架,可惜上传没有提供上传进度,需要自定义RequestBody才能实现。网上有很多的文章表示都是差不多。自定义RequestBoyd代码如下:
  1. private RequestBody createUploadFileRequestBody(final MediaType mediaType,
  2.                                               final  File file,
  3.                                               final IProgressListener iProgressListener) {
  4.         return new RequestBody() {
  5.             @Override
  6.             public MediaType contentType() {
  7.                 return mediaType;
  8.             }

  9.             @Override
  10.             public long contentLength() throws IOException {
  11.                 return file.length();
  12.             }

  13.             @Override
  14.             public void writeTo(BufferedSink sink) throws IOException {
  15.                 Source source;
  16.                 try {
  17.                     source = Okio.source(file);
  18.                     Buffer buffer = new Buffer();
  19.                     long conentLength = contentLength();
  20.                     long length = -1;
  21.                     long bufferSize = 1024 * 1024;
  22.                     long progress = 0;
  23.                     while ((length = source.read(buffer, bufferSize)) != -1) {
  24.                         sink.write(buffer, length);
  25.                         progress += length;
  26.                         iProgressListener.onProgress(conentLength,
  27.                                 progress, (progress == conentLength));
  28.                     }

  29.                     sink.flush();
  30. source.close();
  31.                 } catch (Exception e) {
  32.                     e.printStackTrace();
  33.                 }
  34.             }
  35.         };
  36.     }
复制代码

监听下载进度的接口

  1. public interface IProgressListener {
  2.     /**
  3.      * 上传,下载 进度的监听
  4. * @param contentLength 文件的大小
  5. * @param progress  进度
  6. * @param isDone 是否完成
  7. */
  8. void onProgress(long contentLength, long progress, boolean isDone);

  9.     /**
  10.      * 错误接口
  11. * @param requestUrl 请求的url
  12.      * @param errorMsg 错误的信息
  13. */
  14. void onFailure(String requestUrl, String errorMsg);
  15. }
复制代码

使用方法

  1. RequestBody uploadFileRequestBody = createUploadFileRequestBody(MultipartBody.<font color="#660e7a"><i>FORM</i></font>,
  2.         uploadFile, iProgressListener);

  3. Request uploadRequest = <font color="#000080">new </font>Request.Builder()
  4.                             .url(uploadHttpUrl)
  5.                             .post(uploadRequestBody)
  6.                             .build();

  7. <font color="#660e7a">mOkHttpClient</font>.newCall(uploadRequest).enqueue(<font color="#000080">new </font>Callback() {
  8.      <font color="#808000">@Override
  9. </font><font color="#808000">     </font><font color="#000080">public void </font>onFailure(Call call, IOException e) {
  10.          System.<font color="#660e7a"><i>out</i></font>.println(<font color="#008000">"onFailure: " </font>+ e.getMessage());
  11.      }

  12.      <font color="#808000">@Override
  13. </font><font color="#808000">     </font><font color="#000080">public void </font>onResponse(Call call, Response response) <font color="#000080">throws </font>IOException {
  14.          System.<font color="#660e7a"><i>out</i></font>.println(<font color="#008000">"onResponse code: " </font>+ response.code());
  15.          <font color="#000080">if </font>(response.isSuccessful()) {
  16.              System.<font color="#660e7a"><i>out</i></font>.println(<font color="#008000">"onResponse: " </font>+ response.body().string());
  17.          }
  18.          call.cancel();
  19.      }
  20. });
复制代码

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表