aaynctask控制多个下载进度_AsyncTask用法解析-下载文件动态更新进度条
1. 泛型
AysncTask
Params:启动任务时传入的参数,通过调用asyncTask.execute(param)方法传入。
Progress:后台任务执行的进度,若不用显示进度条,则不需要指定。
Result:后台任务结束时返回的结果。
2. 重要方法
doInBackground(Params... params):必须重写的方法,后台任务就在这里执行,会开启一个新的线程。params为启动任务时传入的参数,参数个数不定。
onPreExecute():在主线程中调用,在后台任务开启前的操作在这里进行,例如显示一个进度条对话框。
onPostExecute(Result result):当后台任务结束后,在主线程中调用,处理doInBackground()方法返回的结果。
onProgressUpdate(Progress... values):当在doInBackground()中调用publishProgress(Progress... values)时,返回主线程中调用,这里的参数个数也是不定的。
onCancelled():取消任务。
3. 注意事项
(1)execute()方法必须在主线程中调用;
(2)AsyncTask实例必须在主线程中创建;
(3)不要手动调用doInBackground()、onPreExecute()、onPostExecute()、onProgressUpdate()方法;
(4)注意防止内存泄漏,在doInBackground()方法中若出现对Activity的强引用,可能会造成内存泄漏。
4. 下载文件动态更新进度条(未封装)
布局:
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="20dp"
tools:context="com.studying.asynctaskdemo.MainActivity">
android:id="@+id/progressBar"
style="?android:progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:progress="0" />
android:id="@+id/download"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginTop="20dp"
android:text="@string/start_btn" />
android:id="@+id/status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="@string/waiting" />
Activity:
public class MainActivity extends Activity {
private static final String FILE_NAME = "test.pdf";//下载文件的名称
private static final String PDF_URL = "http://clfile.imooc.com/class/assist/118/1328281/AsyncTask.pdf";
private ProgressBar mProgressBar;
private Button mDownloadBtn;
private TextView mStatus;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
setListener();
}
private void initView() {
mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
mDownloadBtn = (Button) findViewById(R.id.download);
mStatus = (TextView) findViewById(R.id.status);
}
private void setListener() {
mDownloadBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//AsyncTask实例必须在主线程创建
DownloadAsyncTask asyncTask = new DownloadAsyncTask();
asyncTask.execute(PDF_URL);
}
});
}
/**
* 泛型:
* String:传入参数为文件下载地址
* Integer:下载过程中更新ProgressBar的进度
* Boolean:是否下载成功
*/
private class DownloadAsyncTask extends AsyncTask {
private String mFilePath;//下载文件的保存路径
@Override
protected Boolean doInBackground(String... params) {
if (params != null && params.length > 0) {
String pdfUrl = params[0];
try {
URL url = new URL(pdfUrl);
URLConnection urlConnection = url.openConnection();
InputStream in = urlConnection.getInputStream();
int contentLength = urlConnection.getContentLength();//获取内容总长度
mFilePath = Environment.getExternalStorageDirectory() + File.separator + FILE_NAME;
//若存在同名文件则删除
File pdfFile = new File(mFilePath);
if (pdfFile.exists()) {
boolean result = pdfFile.delete();
if (!result) {
return false;
}
}
int downloadSize = 0;//已经下载的大小
byte[] bytes = new byte[1024];
int length = 0;
OutputStream out = new FileOutputStream(mFilePath);
while ((length = in.read(bytes)) != -1) {
out.write(bytes, 0, length);
downloadSize += length;
publishProgress(downloadSize / contentLength * 100);
}
in.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
return false;
}
} else {
return false;
}
return true;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
mDownloadBtn.setText("下载中");
mDownloadBtn.setEnabled(false);
mStatus.setText("下载中");
mProgressBar.setProgress(0);
}
@Override
protected void onPostExecute(Boolean aBoolean) {
super.onPostExecute(aBoolean);
mDownloadBtn.setText("下载完成");
mStatus.setText(aBoolean ? "下载完成" + mFilePath : "下载失败");
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
if (values != null && values.length > 0) {
mProgressBar.setProgress(values[0]);
}
}
}
}
5. 下载文件动态更新进度条(封装)
Activity:
public class MainActivity extends Activity {
private static final String FILE_NAME = "test.pdf";
private static final String PDF_URL = "http://clfile.imooc.com/class/assist/118/1328281/AsyncTask.pdf";
private ProgressBar mProgressBar;
private Button mDownloadBtn;
private TextView mStatus;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
setListener();
}
private void initView() {
mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
mDownloadBtn = (Button) findViewById(R.id.download);
mStatus = (TextView) findViewById(R.id.status);
}
private void setListener() {
mDownloadBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String localPath = Environment.getExternalStorageDirectory() + File.separator + FILE_NAME;
DownloadHelper.download(PDF_URL, localPath, new DownloadHelper.OnDownloadListener() {
@Override
public void onStart() {
mDownloadBtn.setText("下载中");
mDownloadBtn.setEnabled(false);
mStatus.setText("下载中");
mProgressBar.setProgress(0);
}
@Override
public void onSuccess(File file) {
mDownloadBtn.setText("下载完成");
mStatus.setText(String.format("下载完成:%s", file.getPath()));
}
@Override
public void onFail(File file, String failInfo) {
mDownloadBtn.setText("开始下载");
mDownloadBtn.setEnabled(true);
mStatus.setText(String.format("下载失败:%s", failInfo));
}
@Override
public void onProgress(int progress) {
mProgressBar.setProgress(progress);
}
});
}
});
}
}
DownloadHelper:
class DownloadHelper {
static void download(String url, String localPath, OnDownloadListener listener) {
DownloadAsyncTask task = new DownloadAsyncTask(url, localPath, listener);
task.execute();
}
private static class DownloadAsyncTask extends AsyncTask {
private String mFailInfo;
private String mUrl;
private String mFilePath;
private OnDownloadListener mListener;
DownloadAsyncTask(String mUrl, String mFilePath, OnDownloadListener mListener) {
this.mUrl = mUrl;
this.mFilePath = mFilePath;
this.mListener = mListener;
}
@Override
protected Boolean doInBackground(String... params) {
String pdfUrl = mUrl;
try {
URL url = new URL(pdfUrl);
URLConnection urlConnection = url.openConnection();
InputStream in = urlConnection.getInputStream();
int contentLength = urlConnection.getContentLength();
File pdfFile = new File(mFilePath);
if (pdfFile.exists()) {
boolean result = pdfFile.delete();
if (!result) {
mFailInfo = "存储路径下的同名文件删除失败!";
return false;
}
}
int downloadSize = 0;
byte[] bytes = new byte[1024];
int length;
OutputStream out = new FileOutputStream(mFilePath);
while ((length = in.read(bytes)) != -1) {
out.write(bytes, 0, length);
downloadSize += length;
publishProgress(downloadSize / contentLength * 100);
}
in.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
mFailInfo = e.getMessage();
return false;
}
return true;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
if (mListener != null) {
mListener.onStart();
}
}
@Override
protected void onPostExecute(Boolean aBoolean) {
super.onPostExecute(aBoolean);
if (mListener != null) {
if (aBoolean) {
mListener.onSuccess(new File(mFilePath));
} else {
mListener.onFail(new File(mFilePath), mFailInfo);
}
}
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
if (values != null && values.length > 0) {
if (mListener != null) {
mListener.onProgress(values[0]);
}
}
}
}
interface OnDownloadListener{
void onStart();
void onSuccess(File file);
void onFail(File file, String failInfo);
void onProgress(int progress);
}
}
aaynctask控制多个下载进度_AsyncTask用法解析-下载文件动态更新进度条相关推荐
- 美拍视频怎么下载?美拍视频解析下载和保存工具
本文转载: 美拍视频怎么下载?美拍视频解析下载和保存工具 怎么下载美拍视频保存到手机本地?解析美拍视频下载和保存工具可以在线实现美拍视频链接转换并保存美拍视频到本地. 美拍视频怎么下载?手机怎么保存美 ...
- PHP下载m3u8视频及解析下载ts资源文件
上一篇写了PHP生成合并ts脚本,后来又想直接下载m3u8里面的ts,又码了一段. <?php /** PHP下载m3u8视频和及解析下载ts资源文件** @file m3u8download. ...
- Android --- Retrofit 上传/下载文件扩展实现进度的监听
本文使用okhttp作为client来做,其实说白了跟用okhttp做下载上传进度监听几乎一样,参考了这篇文章:Android OkHttp文件上传与下载的进度监听扩展 1. 首先我们写两个接口用来下 ...
- a标签下载图片及js执行下载图片
原因: 我发现href的值是网络地址就是添加了download属性还是会直接打开图片而不是直接下载,只有写成相对地址添加了download属性才会执行下载,但是存在兼容性问题 如下: <a hr ...
- java fileupload 进度_SpringBoot+fileUpload获取文件上传进度
我本人在网上找了很多关于文件上传进度获取的文章,普遍基于spring MVC 框架通过 fileUpload 实现,对于spring Boot 通过 fileUpload 实现的帖子非常少,由于小弟学 ...
- JavaWeb 使用ajax上传文件并显示进度条等上传信息
文件上传在Web程序中是常用的功能,一般上传图片或者文件大小比较少的文件客户端不需要显示上传进度或文件上传的信息,如果是上传的文件比较大的时候,可以在客户端展示文件上传进度以及根据业务的需求显示文件上 ...
- aaynctask控制多个下载进度_史上最强的进度图绘制十大注意事项!
在任何情况下,管理者都必须确保项目在计划的控制下运行.好比我们知道一个目标点,到达这个目标点有N条路径,我们要根据各种限制条件找出其中较为合理的路径,并根据各种各样的变化随时调整这个路径. 1. 如何 ...
- aaynctask控制多个下载进度_使用 Python 下载的 11 种姿势,一种比一种高级
点击上方"Python编程时光",选择"加为星标"第一时间关注Python技术干货! 原文链接:http://dwz.date/cQjK 在本教程中,你将学习如 ...
- 实现在 .net 中使用 HttpClient 下载文件时显示进度
在 .net framework 中,要实现下载文件并显示进度的话,最简单的做法是使用 WebClient 类.订阅 DownloadProgressChanged 事件就行了. 但是很可惜,WebC ...
最新文章
- linux 格式化 dvd,linux 服务器分区格式化相关知识 -mount
- C/C++开发中防止头文件被重复引入的3种方法
- Java中的数据类型及相互转换方法
- 基于React和SpringBoot的快速开发模板QuickAdmin
- github java开源项目经验_3月份GitHub上最热门的Java开源项目
- const修饰是指针和常量
- stauml工具怎么导入文件_小伙教大家怎么剪辑短视频,1小时就学会添加字幕,值得收藏哦...
- 今日恐慌与贪婪指数为40 恐慌程度有所上升
- 你需要明白的SQL SERVER书签查找(Bookmark Lookup)
- Qt总结之二:遍历文件夹和文件目录,并过滤和获取文件信息、后缀名、前缀名(二)
- 给大家讲讲在哪些地方发外链最好
- 详解数据治理体系(值得收藏)
- 网络安全CTF竞赛模式、题目类别、所用工具小结
- 计量经济学实验报告计算机,计量经济学实验报告记录.doc
- java查找pdf关键字_Java定位PDF中关键字的坐标
- 2019年9月省市区/县SQL数据——第二篇
- Storm DRPC环境搭建笔记
- 用QuartusII 操作操作1位全加法器单位延时仿真
- 在SpringBoot中添加发送邮件功能
- RecyclerView布局中解决edittext监听错乱