当前位置: 安卓之星 -> 安卓开发 -> okhttp上传并且显示进度

okhttp上传并且显示进度

作者:网络 发表于: 2017-02-26 点击: 521 次

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

            @Override
            public void writeTo(BufferedSink sink) throws IOException {
                Source source;
                try {
                    source = Okio.source(file);
                    Buffer buffer = new Buffer();
                    long conentLength = contentLength();
                    long length = -1;
                    long bufferSize = 1024 * 1024;
                    long progress = 0;
                    while ((length = source.read(buffer, bufferSize)) != -1) {
                        sink.write(buffer, length);
                        progress += length;
                        iProgressListener.onProgress(conentLength,
                                progress, (progress == conentLength));
                    }

                    sink.flush();
source.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };
    }

监听下载进度的接口

public interface IProgressListener {
/**
* 上传,下载 进度的监听
* @param contentLength 文件的大小
* @param progress  进度
* @param isDone 是否完成
*/
void onProgress(long contentLength, long progress, boolean isDone);
/**
 * 错误接口
 * @param requestUrl 请求的url
 * @param errorMsg 错误的信息
 */
void onFailure(String requestUrl, String errorMsg);
}

使用方法

RequestBody uploadFileRequestBody = createUploadFileRequestBody(MultipartBody.FORM,
        uploadFile, iProgressListener);

Request uploadRequest = new Request.Builder()
                            .url(uploadHttpUrl)
                            .post(uploadRequestBody)
                            .build(); 

mOkHttpClient.newCall(uploadRequest).enqueue(new Callback() {
     @Override
     public void onFailure(Call call, IOException e) {
         System.out.println(“onFailure: ” + e.getMessage());
     }

     @Override
     public void onResponse(Call call, Response response) throws IOException {
         System.out.println(“onResponse code: ” + response.code());
         if (response.isSuccessful()) {
             System.out.println(“onResponse: ” + response.body().string());
         }
         call.cancel();
     }
});

相关文章

相关文章

赶快留言冒泡

  • 评论 (0)
  • 引用通告 (0)
目前还没有任何评论.
目前还没有任何Trackbacks和Pingbacks.
吐个泡浮上去.