首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用OkHttp3在安卓系统中上传文件时显示ProgressBar

在安卓系统中使用OkHttp3上传文件时显示ProgressBar,可以通过以下步骤实现:

  1. 首先,确保已经在项目中引入了OkHttp3库。可以在项目的build.gradle文件中添加以下依赖项:
代码语言:txt
复制
implementation 'com.squareup.okhttp3:okhttp:4.9.1'
  1. 在安卓布局文件中,添加一个ProgressBar用于显示上传进度。可以使用系统自带的ProgressBar或者自定义样式。例如,在XML布局文件中添加以下代码:
代码语言:txt
复制
<ProgressBar
    android:id="@+id/progressBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    style="?android:attr/progressBarStyleHorizontal"
    android:max="100"
    android:progress="0" />
  1. 在安卓代码中,使用OkHttp3进行文件上传,并更新ProgressBar的进度。以下是一个示例代码:
代码语言:txt
复制
import okhttp3.*;

import java.io.File;
import java.io.IOException;

public class FileUploader {
    private static final String UPLOAD_URL = "http://example.com/upload"; // 替换为实际的上传URL

    public void uploadFile(File file, final ProgressListener progressListener, final Callback callback) {
        OkHttpClient client = new OkHttpClient.Builder()
                .addNetworkInterceptor(new Interceptor() {
                    @Override
                    public Response intercept(Chain chain) throws IOException {
                        Response originalResponse = chain.proceed(chain.request());
                        return originalResponse.newBuilder()
                                .body(new ProgressResponseBody(originalResponse.body(), progressListener))
                                .build();
                    }
                })
                .build();

        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(UPLOAD_URL)
                .post(requestBody)
                .build();

        client.newCall(request).enqueue(callback);
    }

    public interface ProgressListener {
        void onProgress(int progress);
    }

    private static class ProgressResponseBody extends ResponseBody {
        private final ResponseBody responseBody;
        private final ProgressListener progressListener;
        private BufferedSource bufferedSource;

        public ProgressResponseBody(ResponseBody responseBody, ProgressListener progressListener) {
            this.responseBody = responseBody;
            this.progressListener = progressListener;
        }

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

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

        @Override
        public BufferedSource source() {
            if (bufferedSource == null) {
                bufferedSource = Okio.buffer(source(responseBody.source()));
            }
            return bufferedSource;
        }

        private Source source(Source source) {
            return new ForwardingSource(source) {
                long totalBytesRead = 0L;

                @Override
                public long read(Buffer sink, long byteCount) throws IOException {
                    long bytesRead = super.read(sink, byteCount);
                    totalBytesRead += bytesRead != -1 ? bytesRead : 0;
                    int progress = (int) (totalBytesRead * 100 / responseBody.contentLength());
                    progressListener.onProgress(progress);
                    return bytesRead;
                }
            };
        }
    }
}
  1. 在安卓代码中,使用上述FileUploader类进行文件上传,并更新ProgressBar的进度。以下是一个示例代码:
代码语言:txt
复制
import android.app.Activity;
import android.os.Bundle;
import android.widget.ProgressBar;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;

import java.io.File;
import java.io.IOException;

public class MainActivity extends Activity {
    private ProgressBar progressBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        progressBar = findViewById(R.id.progressBar);

        File file = new File("path/to/file"); // 替换为实际的文件路径

        FileUploader fileUploader = new FileUploader();
        fileUploader.uploadFile(file, new FileUploader.ProgressListener() {
            @Override
            public void onProgress(final int progress) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        progressBar.setProgress(progress);
                    }
                });
            }
        }, new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                // 处理上传失败的情况
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                // 处理上传成功的情况
            }
        });
    }
}

这样,当文件上传时,ProgressBar将显示上传进度。你可以根据实际需求进行进一步的定制和优化。

腾讯云相关产品推荐:腾讯云对象存储(COS),它是一种安全、稳定、高效、低成本的云端存储服务,适用于存储和处理各类文件,包括图片、音视频、文档等。你可以通过以下链接了解更多信息:

腾讯云对象存储(COS)

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 领券