eoe 移动开发者论坛

 找回密码
 加入eoe

QQ登录

只需一步,快速开始

查看: 952|回复: 5
收起左侧

[Android实例] okhttp上传并且显示进度

[复制链接]

签到天数: 18 天

连续签到: 1 天

[LV.4]偶尔看看III

12

主题

811

帖子

2833

e币
发表于 2016-11-17 15:50:03 | 显示全部楼层 |阅读模式

没有eoe的账号,级别还太低,出门如何吹牛逼?

您需要 登录 才可以下载或查看,没有帐号?加入eoe

x
本帖最后由 changkai245 于 2016-11-17 15:51 编辑

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();
     }
});

签到天数: 128 天

连续签到: 1 天

[LV.7]常住居民III

0

主题

198

帖子

1395

e币
发表于 2016-11-18 09:24:35 | 显示全部楼层
不错呀  学习下

签到天数: 6 天

连续签到: 1 天

[LV.2]偶尔看看I

0

主题

14

帖子

57

e币
发表于 2017-2-18 18:20:14 | 显示全部楼层
谢谢楼主的耐心讲解,小弟是个Android开发的初学者,现在学习了,谢谢。

签到天数: 1 天

连续签到: 1 天

[LV.1]初来乍到

0

主题

3

帖子

47

e币
发表于 2017-2-26 18:23:57 | 显示全部楼层
太好了,学习学习!

签到天数: 57 天

连续签到: 1 天

[LV.5]常住居民I

1

主题

74

帖子

531

e币
发表于 2017-3-2 08:56:06 | 显示全部楼层
我就试试我能不能评论

签到天数: 17 天

连续签到: 3 天

[LV.4]偶尔看看III

3

主题

33

帖子

50

e币
发表于 2017-7-13 09:45:34 | 显示全部楼层
ssssssssssssssssssssssssssssssssssssssssssssssssssss
*滑动验证:
您需要登录后才可以回帖 登录 | 加入eoe

本版积分规则

推荐阅读
赞助商们

QQ|联系我们|小黑屋|手机版|eoe 移动开发者论坛 ( 京ICP备11018032 京公网安11010802020210  

GMT+8, 2017-9-22 06:52 , Processed in 0.591571 second(s), 40 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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

扫一扫 关注eoe官方微信