AsyncTask 下载视频
时间: 2023-11-25 11:07:25 浏览: 36
在 AsyncTask 中下载视频的步骤如下:
1. 在 doInBackground() 方法中执行网络请求,获取视频数据并存储到本地文件中。
```java
@Override
protected String doInBackground(String... urls) {
String url = urls[0];
try {
URL videoUrl = new URL(url);
HttpURLConnection connection = (HttpURLConnection) videoUrl.openConnection();
connection.connect();
// 获取视频文件长度
int length = connection.getContentLength();
// 创建输入流
InputStream input = new BufferedInputStream(connection.getInputStream());
// 创建输出流
OutputStream output = new FileOutputStream(Environment.getExternalStorageDirectory() + "/video.mp4");
byte[] data = new byte[1024];
long total = 0;
int count;
while ((count = input.read(data)) != -1) {
total += count;
// 计算进度
int progress = (int) ((total * 100) / length);
publishProgress(progress);
// 写入文件
output.write(data, 0, count);
}
// 关闭流
output.flush();
output.close();
input.close();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
```
2. 在 onProgressUpdate() 方法中更新下载进度。
```java
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
int progress = values[0];
// 更新进度条
progressBar.setProgress(progress);
}
```
3. 在 onPostExecute() 方法中通知用户下载完成。
```java
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
// 下载完成
Toast.makeText(context, "下载完成", Toast.LENGTH_SHORT).show();
}
```
完整的 AsyncTask 下载视频的代码如下:
```java
public class DownloadVideoTask extends AsyncTask<String, Integer, String> {
private Context context;
private ProgressBar progressBar;
public DownloadVideoTask(Context context, ProgressBar progressBar) {
this.context = context;
this.progressBar = progressBar;
}
@Override
protected String doInBackground(String... urls) {
String url = urls[0];
try {
URL videoUrl = new URL(url);
HttpURLConnection connection = (HttpURLConnection) videoUrl.openConnection();
connection.connect();
// 获取视频文件长度
int length = connection.getContentLength();
// 创建输入流
InputStream input = new BufferedInputStream(connection.getInputStream());
// 创建输出流
OutputStream output = new FileOutputStream(Environment.getExternalStorageDirectory() + "/video.mp4");
byte[] data = new byte[1024];
long total = 0;
int count;
while ((count = input.read(data)) != -1) {
total += count;
// 计算进度
int progress = (int) ((total * 100) / length);
publishProgress(progress);
// 写入文件
output.write(data, 0, count);
}
// 关闭流
output.flush();
output.close();
input.close();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
int progress = values[0];
// 更新进度条
progressBar.setProgress(progress);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
// 下载完成
Toast.makeText(context, "下载完成", Toast.LENGTH_SHORT).show();
}
}
```
使用方法如下:
```java
ProgressBar progressBar = findViewById(R.id.progress_bar);
DownloadVideoTask task = new DownloadVideoTask(this, progressBar);
task.execute("http://www.example.com/video.mp4");
```