【问题标题】:Get progress by using MultipartBuilder in android在 android 中使用 MultipartBuilder 取得进展
【发布时间】:2019-04-30 17:18:02
【问题描述】:

我正在使用 okhttp 将 http 表单发送到服务器。这是我的要求:

OkHttpClient client = new OkHttpClient();     
RequestBody multiPartBody = new MultipartBody.Builder()
                        .setType(MultipartBody.FORM)
                        .addPart(
                                Headers.of("Content-Disposition", "form-data; name=\"file0\"; filename=\"" + name.split("\\.")[0] + "\""),
                                RequestBody.create(MediaType.parse(mediaType), new File(path)))
                        .addFormDataPart("RadUAG_fileName", name)
                        .addFormDataPart("RadUAG_position", "0")
    Request request = new Request.Builder()
                        .url("http://xxx.xxx.xxx.xxx/ArchiveSite/Handlers/RadUploadHandler.ashx")
                        .post(multiPartBody)
                        .build();
    client.newCall(request).execute()

现在假设我的文件很大,我想向用户显示发送到服务器的上传量的进度。

如何获取发送到服务器并显示给用户进度条的大量文件?

如您所见,我正在使用okhttp,我想在这个库中找到解决方案。

【问题讨论】:

标签: android okhttp3


【解决方案1】:

我发现这个example 自定义RequestBody

所以我创建CountingFileRequestBody 类:

public class CountingFileRequestBody extends RequestBody {

    private static final int SEGMENT_SIZE = 2048;
    private final File file;
    private final ProgressListener listener;
    private final String contentType;

    public CountingFileRequestBody(File file, String contentType, ProgressListener listener) {
        this.file = file;
        this.contentType = contentType;
        this.listener = listener;
    }

    @Override
    public long contentLength() {
        return file.length();
    }

    @Override
    public MediaType contentType() {
        return MediaType.parse(contentType);
    }

    @Override
    public void writeTo(BufferedSink sink) throws IOException {
        Source source = null;
        try {
            source = Okio.source(file);
            long total = 0;
            long read;

            while ((read = source.read(sink.buffer(), SEGMENT_SIZE)) != -1) {
                total += read;
                sink.flush();
                this.listener.transferred(total);

            }
        } finally {
            Util.closeQuietly(source);
        }
    }

    public interface ProgressListener {
        void transferred(long num);
    }
}

在主要活动中我这样使用:

RequestBody multiPartBody = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addPart(
                        Headers.of("Content-Disposition", "form-data; name=\"file0\"; filename=\"" + name.split("\\.")[0] + "\""),
                        new CountingFileRequestBody(new File(path), mediaType, new CountingFileRequestBody.ProgressListener() {
                            @Override
                            public void transferred(long num) {
                                float progress = (num / (float) totalSize) * 100;
                                handler.post(() -> {
                                    mProgress.setProgress((int) progress);
                                    tvProgressPercentage.setText((int) progress + "%");
                                });
                            }
                        }))
                .addFormDataPart("RadUAG_fileName", name)

现在我有一个进度要显示给用户:-)

【讨论】:

    猜你喜欢
    • 2015-10-20
    • 2020-03-11
    • 2015-07-08
    • 2016-09-21
    • 2013-04-23
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多