帮我用Okhttp 封装一个Android的文件下载器
时间: 2024-06-10 11:03:48 浏览: 17
好的,我可以为您编写使用OkHttp封装的Android文件下载器。以下是代码示例:
首先,在您的build.gradle文件中添加依赖:
```groovy
implementation 'com.squareup.okhttp3:okhttp:4.9.0'
```
接下来,创建一个名为`FileDownloader`的Java类,并添加以下代码:
```java
import android.os.AsyncTask;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class FileDownloader extends AsyncTask<String, Integer, File> {
private final String url;
private final File file;
private final ProgressListener listener;
public FileDownloader(String url, File file, ProgressListener listener) {
this.url = url;
this.file = file;
this.listener = listener;
}
@Override
protected void onPreExecute() {
if (listener != null) {
listener.onStart();
}
}
@Override
protected File doInBackground(String... strings) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.build();
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
}
if (file.exists()) {
file.delete();
}
try (InputStream inputStream = response.body().byteStream();
OutputStream outputStream = new java.io.FileOutputStream(file)) {
byte[] buffer = new byte[4096];
long totalBytesRead = 0;
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
totalBytesRead += bytesRead;
if (listener != null) {
listener.onProgressUpdate((int) (totalBytesRead * 100 / response.body().contentLength()));
}
}
outputStream.flush();
}
return file;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(File result) {
if (listener != null) {
if (result != null) {
listener.onComplete(result);
} else {
listener.onError();
}
}
}
public interface ProgressListener {
void onStart();
void onProgressUpdate(int progress);
void onComplete(File file);
void onError();
}
}
```
在这个类中,我们使用了OkHttp客户端来执行HTTP请求,并将文件下载到指定的文件中。此外,我们还实现了一个`ProgressListener`接口,以便在下载过程中通知UI更新。
最后,在您的Activity中,您可以调用如下代码来执行下载操作:
```java
File file = new File(getExternalFilesDir(null), "my_file.txt");
String url = "http://www.example.com/my_file.txt";
new FileDownloader(url, file, new FileDownloader.ProgressListener() {
@Override
public void onStart() {
// 显示进度条
}
@Override
public void onProgressUpdate(int progress) {
// 更新进度条
}
@Override
public void onComplete(File file) {
// 下载完成,执行你需要的操作
}
@Override
public void onError() {
// 下载出错,执行你需要的操作
}
}).execute();
```
这个类会返回下载到的文件,您可以根据需要对其进行操作。同时,在下载完成时,您可以执行自定义操作,例如更新UI或执行其他任务。