返回

使用OkHttp + Retrofit下载文件,轻松掌控文件传输进度

Android

Android入门教程:使用OkHttp + Retrofit下载文件并监听进度

绪论

下载文件在Android开发中是一个常见且重要的任务。无论是更新应用程序还是加载用户数据,都需要具备可靠且高效的文件下载机制。本教程将介绍如何利用OkHttp和Retrofit实现文件下载功能,并添加进度监听机制,让您随时掌握文件传输的动态。

使用OkHttp进行文件下载

OkHttp是一个功能强大的Android HTTP客户端库,支持各种HTTP操作,包括文件下载。要使用OkHttp下载文件,我们需要执行以下步骤:

  1. 创建一个OkHttpClient对象:
OkHttpClient client = new OkHttpClient();
  1. 创建一个包含文件下载URL的请求对象:
Request request = new Request.Builder()
  .url("https://example.com/file.zip")
  .build();
  1. 执行请求并获取响应对象:
Response response = client.newCall(request).execute();
  1. 打开文件输出流:
FileOutputStream fos = new FileOutputStream(new File("file.zip"));
  1. 从响应中读取字节并写入文件:
byte[] buffer = new byte[1024];
int len;
while ((len = response.body().byteStream().read(buffer)) != -1) {
  fos.write(buffer, 0, len);
}
  1. 关闭文件输出流:
fos.close();

使用Retrofit进行文件下载

Retrofit是一个基于注解的网络访问框架,可以简化网络请求的过程。它提供了一种更简洁的方式来下载文件:

  1. 定义一个下载文件的方法接口:
@GET("/file.zip")
Call<ResponseBody> downloadFile();
  1. 在Activity或Fragment中创建Retrofit实例和Call对象:
Retrofit retrofit = new Retrofit.Builder()
  .baseUrl("https://example.com")
  .build();

Call<ResponseBody> call = retrofit.create(DownloadService.class).downloadFile();
  1. 执行请求并处理响应:
call.enqueue(new Callback<ResponseBody>() {
  @Override
  public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
    // 处理成功的响应
  }

  @Override
  public void onFailure(Call<ResponseBody> call, Throwable t) {
    // 处理失败的响应
  }
});

添加进度监听

为了实时监控文件下载进度,我们需要添加进度监听器。OkHttp和Retrofit都提供内置机制来实现此功能:

OkHttp进度监听

OkHttpClient client = new OkHttpClient();
client.newBuilder().addInterceptor(new Interceptor() {
  @Override
  public Response intercept(Chain chain) throws IOException {
    Request request = chain.request();
    Response response = chain.proceed(request);
    return response.newBuilder()
      .body(new ProgressResponseBody(response.body(), progressListener))
      .build();
  }
});

Retrofit进度监听

Retrofit retrofit = new Retrofit.Builder()
  .baseUrl("https://example.com")
  .addConverterFactory(ProgressResponseBodyConverter.create())
  .build();

Call<ResponseBody> call = retrofit.create(DownloadService.class).downloadFile();

自定义的ProgressResponseBody类负责跟踪下载进度并通知监听器:

public 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;
        progressListener.update(totalBytesRead, responseBody.contentLength(), bytesRead == -1);
        return bytesRead;
      }
    };
  }
}

总结

本教程介绍了如何使用OkHttp和Retrofit进行文件下载,并添加进度监听机制以实时监控下载进度。利用这些技术,您可以轻松创建可靠且高效的文件下载功能,从而增强您的Android应用程序的功能。