使用OkHttp在Android中实现文件下载及进度显示

5 下载量 6 浏览量 更新于2024-08-30 收藏 102KB PDF 举报
"这篇教程主要介绍了如何在Android应用中使用OkHttp框架实现文件下载并同时显示下载进度条的功能。OkHttp是一个高效的网络库,提供同步和异步请求、缓存支持以及拦截器功能,特别适合处理大文件的下载和上传。在开始之前,建议先搭建一个简单的服务器,例如通过本地Tomcat,将待下载的文件放在服务器的指定目录。本文将分为服务器端的准备和Android客户端的实现两个部分进行讲解。" 在Android应用中,使用OkHttp进行文件下载首先需要在`build.gradle`文件中添加依赖项,包括`appcompat-v7`、`okhttp`和`okio`库。添加如下代码: ```groovy dependencies { compile 'com.android.support:appcompat-v7:24.1.1' compile 'com.squareup.okhttp3:okhttp:3.2.0' compile 'com.squareup.okio:okio:1.7.0' } ``` 接下来是Android客户端的实现。在布局文件`activity_main.xml`中,创建一个用于显示进度的`ProgressBar`和一个按钮,用于触发下载操作。示例代码如下: ```xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_horizontal_margin"> <Button android:id="@+id/button_download" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="下载文件" /> <ProgressBar android:id="@+id/progress_bar" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/button_download" android:max="100" android:progress="0" /> </RelativeLayout> ``` 在对应的Activity中,需要创建一个OkHttpClient实例,并使用它发起HTTP请求获取文件。为了获取下载进度,我们需要实现一个`Interceptor`,并在拦截器中更新进度条。以下是一个简单的实现: ```java public class DownloadActivity extends AppCompatActivity { private Button downloadButton; private ProgressBar progressBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); downloadButton = findViewById(R.id.button_download); progressBar = findViewById(R.id.progress_bar); downloadButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { downloadFile(); } }); } private void downloadFile() { // 创建OkHttpClient实例 OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request originalRequest = chain.request(); Request requestWithProgress = originalRequest.newBuilder() .build(); Response rawResponse = chain.proceed(requestWithProgress); long contentLength = rawResponse.body().contentLength(); return rawResponse.newBuilder() .body(new ProgressResponseBody(contentLength, progressBar)) .build(); } }) .build(); String url = "http://localhost:8080/OkHttpServer/download/2.jpg"; Request request = new Request.Builder().url(url).build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { // 处理失败情况 } @Override public void onResponse(Call call, Response response) throws IOException { if (!response.isSuccessful()) { // 处理非200状态码 } else { // 将响应体写入本地文件,此处省略具体实现 } } }); } // 自定义ProgressResponseBody,用于更新进度条 static class ProgressResponseBody extends ResponseBody { private final ResponseBody delegate; private final ProgressListener listener; private BufferedSource source; ProgressResponseBody(ResponseBody delegate, ProgressListener listener) { this.delegate = delegate; this.listener = listener; } @Override public MediaType contentType() { return delegate.contentType(); } @Override public long contentLength() { return delegate.contentLength(); } @Override public BufferedSource source() throws IOException { if (source == null) { source = delegate.source(); } return source; } @Override public void close() throws IOException { delegate.close(); } } } ``` 在`ProgressResponseBody`类中,你需要重写`source()`方法,读取响应体时监听进度变化,并通过`ProgressListener`回调更新`ProgressBar`。这里需要注意的是,实际的文件保存操作需要在`onResponse`方法中完成,确保网络请求成功后将数据写入本地文件。 总结来说,要实现在Android应用中使用OkHttp下载文件并显示进度条,需要完成以下步骤: 1. 添加OkHttp和相关依赖到`build.gradle`。 2. 创建布局文件,包含一个下载按钮和进度条。 3. 在Activity中设置按钮点击事件,调用下载方法。 4. 实现OkHttpClient的Interceptor,以便在下载过程中捕获进度信息。 5. 创建自定义的`ResponseBody`子类,监听并更新进度。 6. 在网络请求的`onResponse`回调中处理文件的本地保存。 这个过程涵盖了网络请求、进度监听和UI更新的关键点,可以帮助开发者在Android应用中实现高效且用户友好的文件下载功能。