Android多个文件上传进度显示实现方法

1. 流程概述

在Android中实现多个文件上传的进度显示,可以分为以下几个步骤:

  1. 准备文件列表:将需要上传的文件添加到一个文件列表中。
  2. 上传文件:逐个上传文件,并获取每个文件的上传进度。
  3. 更新进度:根据上传进度更新UI界面的进度条。
  4. 完成上传:在所有文件都上传完毕后,根据需要执行完成上传的操作。

下面将详细介绍每个步骤的具体实现方法。

2. 准备文件列表

首先,我们需要将需要上传的文件添加到一个文件列表中。可以使用ArrayList<File>来存储文件列表,具体代码如下所示:

ArrayList<File> fileList = new ArrayList<File>();
fileList.add(new File("path/to/file1"));
fileList.add(new File("path/to/file2"));
fileList.add(new File("path/to/file3"));

需要注意的是,这里的文件路径需要替换为实际文件的路径。

3. 上传文件

接下来,我们需要逐个上传文件,并获取每个文件的上传进度。可以使用OkHttp库来进行文件上传操作,具体代码如下所示:

OkHttpClient client = new OkHttpClient();
for (File file : fileList) {
    RequestBody requestBody = new MultipartBody.Builder()
            .setType(MultipartBody.FORM)
            .addFormDataPart("file", file.getName(), RequestBody.create(MediaType.parse("application/octet-stream"), file))
            .build();

    Request request = new Request.Builder()
            .url("http://your_upload_url")
            .post(requestBody)
            .build();

    // 发起请求并获取响应
    Response response = client.newCall(request).execute();
    if (response.isSuccessful()) {
        // 文件上传成功
    } else {
        // 文件上传失败
    }
}

需要注意的是,这里的http://your_upload_url需要替换为实际的文件上传接口地址。

4. 更新进度

在上传文件的过程中,我们可以通过计算已上传的文件大小和总文件大小的比例来获取上传进度。具体代码如下所示:

long totalSize = 0;
for (File file : fileList) {
    totalSize += file.length();
}

long uploadedSize = 0;
for (File file : fileList) {
    RequestBody requestBody = new MultipartBody.Builder()
            .setType(MultipartBody.FORM)
            .addFormDataPart("file", file.getName(), RequestBody.create(MediaType.parse("application/octet-stream"), file))
            .build();

    Request request = new Request.Builder()
            .url("http://your_upload_url")
            .post(new CountingRequestBody(requestBody, new CountingRequestBody.Listener() {
                @Override
                public void onRequestProgress(long bytesWritten, long contentLength) {
                    // 更新已上传的文件大小
                    uploadedSize += bytesWritten;

                    // 计算上传进度
                    int progress = (int) (uploadedSize * 100 / totalSize);

                    // 在UI线程中更新进度条
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            // 更新UI界面的进度条
                            progressBar.setProgress(progress);
                        }
                    });
                }
            }))
            .build();

    // 发起请求并获取响应
    Response response = client.newCall(request).execute();
    if (response.isSuccessful()) {
        // 文件上传成功
    } else {
        // 文件上传失败
    }
}

需要注意的是,这里的CountingRequestBody是一个自定义的请求体,用于获取请求的进度。可以参考[OkHttp官方文档](

5. 完成上传

在所有文件都上传完毕后,可以根据需要执行完成上传的操作。例如,可以在上传完成后显示一个上传成功的提示信息,或者进行其他后续处理。具体代码如下所示:

// 在UI线程中执行上传完成的操作
runOnUiThread(new Runnable() {
    @Override
    public void run() {
        // 显示上传成功的提示信息
        Toast.makeText(MainActivity.this, "文件上传成功", Toast.LENGTH_SHORT).show();

        // 进行其他后续处理
        // ...
    }
});

类图

classDiagram
    class File
    class ArrayList
    class OkHttpClient
    class RequestBody
    class MultipartBody
    class MediaType
    class Request
    class Response
    class CountingRequestBody