异步管理机制–Asynctask详解
本文参考:
- android开发者官网
- Android AsyncTask完全解析,带你从源码的角度彻底理解
- Android 多线程—–AsyncTask详解
- Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比
- 译文:Android中糟糕的AsyncTask
- Android AsyncTask 原理浅析
- Android 异步任务——AsyncTask (附使用AsyncTask下载图片Demo)
- Android 异步AsyncTask下载 含有进度条
- Android使用AsyncTask实现可以断点续传的DownloadManager功能
- android中如何下载文件并显示下载进度
DownloadFilesTask.java
public class DownloadFilesTask extends Activity implements OnClickListener{
private ProgressDialog progressDialog= null;
private ProgressBar progressBar;
private Button downloadBt;
static class Downloader{
static long downloadFile(URL url){
long i = 0;
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
i+=1;
return i;
}
}
private class DownloadFiles extends AsyncTask<URL, Integer, Long> {
protected void onPreExecute() {
progressDialog.show(); // 显示进度对话框
}
@Override
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) (((i+1) / (float) count) * 100));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}
@Override
protected void onProgressUpdate(Integer... progress) {
// setProgressPercent(progress[0]);
progressBar.setProgress(progress[0]);
}
@Override
protected void onPostExecute(Long result) {
super.onPostExecute(result);
Toast.makeText(DownloadFilesTask.this, "下载完成,总量为"+result, Toast.LENGTH_SHORT).show();
downloadBt.setEnabled(true);
//消失弹出框
progressDialog.dismiss();
progressBar.setProgress(0);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_download_files_task);
downloadBt = (Button) findViewById(R.id.downloudBt);
downloadBt.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//注意每次需new一个实例,新建的任务只能执行一次,否则会出现异常
// download.setEnabled(false);
progressDialog = new ProgressDialog(this);
progressDialog.setTitle("提示信息");
progressDialog.setMessage("正在下载中,请稍后......");
// 设置setCancelable(false); 表示我们不能取消这个弹出框,等下载完成之后再让弹出框消失
progressDialog.setCancelable(false);
// 设置ProgressDialog样式为圆圈的形式
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressBar = (ProgressBar) findViewById(R.id.progress_bar);
URL url1 = null;
try {
url1 = new URL(getString(R.string.test_mp3));
} catch (MalformedURLException e) {
e.printStackTrace();
}
URL url2 = null;
try {
url2 = new URL(getString(R.string.test_mp3));
} catch (MalformedURLException e) {
e.printStackTrace();
}
URL url3 = null;
try {
url3 = new URL(getString(R.string.test_mp3));
} catch (MalformedURLException e) {
e.printStackTrace();
}
new DownloadFiles().execute(url1, url2, url3);
}
}
layout/activity_download_files_task.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" >
<Button
android:id="@+id/downloudBt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下载" />
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:progress="0"
android:max="100"
android:layout_alignParentBottom="true"
style="?android:attr/progressBarStyleHorizontal"/>
</RelativeLayout>