AsyncTask模拟进度条
2015-11-09 09:36
155 查看
现在开始一个稍微复杂点点的示例,用异步AsyncTask来模拟进度条
1. 布局文件,就放一个ProgressBar
2. MainActivity.java代码:
public class MainActivity extends Activity {
private ProgressBar mProgressBar;
private MyAsyncTask mTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mProgressBar = (ProgressBar)
findViewById(R.id.progressBar);
mTask = new MyAsyncTask();
mTask.execute();
}
class MyAsyncTask extends AsyncTask {
@Override
protected Void doInBackground(Void... params) {
for (int i = 0; i < 100; i++) {
if(isCancelled()){
break;
}
// 模拟进度更新
publishProgress(i);
try {
Thread.sleep(300);
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
if(isCancelled()){
return;
}
// 获取进度更新值
mProgressBar.setProgress(values[0]);
}
}
@Override
protected void onPause() {
super.onPause();
if (mTask != null && mTask.getStatus() ==
AsyncTask.Status.RUNNING) {
// 注意这里cancle方法只是将对应的AsyncTask标注为cancle状态,并不是真正的取消线程的执行
mTask.cancel(true);
}
}
}
让线程的生命周期与activity绑定起来,在这里可以避免一种情况,当进度条未达到最后,按了home键让activity不可见,再次进入activity,进度条并未从开始执行下去,因为前一段线程中的for循环并未执行完毕,等那一段执行完毕后,新的才开始执行。这里利用cancel方法,将线程和activity生命周期绑定起来,就避免了那种bug出现。
3. 运行结果
总结
AsyncTask注意事项:
1. 必须在UI线程中创建AsyncTask的实例
2. 必须在UI线程中调用AsyncTask的execute()方法
3. 重写的四个方法是系统自动调用的,不应该手动调用
4. 每个AsyncTask只能被执行一次,多次调用将会引发异常
5.
四个方法中,doInBackground()是运行在其他线程的,是做异步处理的,不能直接更新UI,其他的方法都是运行在UI线程的,可以用来更新UI
1. 布局文件,就放一个ProgressBar
2. MainActivity.java代码:
public class MainActivity extends Activity {
private ProgressBar mProgressBar;
private MyAsyncTask mTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mProgressBar = (ProgressBar)
findViewById(R.id.progressBar);
mTask = new MyAsyncTask();
mTask.execute();
}
class MyAsyncTask extends AsyncTask {
@Override
protected Void doInBackground(Void... params) {
for (int i = 0; i < 100; i++) {
if(isCancelled()){
break;
}
// 模拟进度更新
publishProgress(i);
try {
Thread.sleep(300);
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
if(isCancelled()){
return;
}
// 获取进度更新值
mProgressBar.setProgress(values[0]);
}
}
@Override
protected void onPause() {
super.onPause();
if (mTask != null && mTask.getStatus() ==
AsyncTask.Status.RUNNING) {
// 注意这里cancle方法只是将对应的AsyncTask标注为cancle状态,并不是真正的取消线程的执行
mTask.cancel(true);
}
}
}
让线程的生命周期与activity绑定起来,在这里可以避免一种情况,当进度条未达到最后,按了home键让activity不可见,再次进入activity,进度条并未从开始执行下去,因为前一段线程中的for循环并未执行完毕,等那一段执行完毕后,新的才开始执行。这里利用cancel方法,将线程和activity生命周期绑定起来,就避免了那种bug出现。
3. 运行结果
总结
AsyncTask注意事项:
1. 必须在UI线程中创建AsyncTask的实例
2. 必须在UI线程中调用AsyncTask的execute()方法
3. 重写的四个方法是系统自动调用的,不应该手动调用
4. 每个AsyncTask只能被执行一次,多次调用将会引发异常
5.
四个方法中,doInBackground()是运行在其他线程的,是做异步处理的,不能直接更新UI,其他的方法都是运行在UI线程的,可以用来更新UI
相关文章推荐
- 异步任务AsyncTask进阶
- 10-排序5 PAT Judge
- 开发自定义拦截器
- Android学习路线指南
- 手机版网站与pc端区别
- flex 添加右键链接
- 机器学习实战笔记(Python实现)-01-机器学习实战
- rest服务器
- 升级安装Win10正式版后出现蓝屏怎么办?Win10蓝屏原因分析及解决方法
- 编程和音乐:为什么写代码的时候听音乐
- 请求传输
- C#第十二天
- js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)
- 【Caffe实践】基于Caffe的人脸关键点检测实现
- jdom学习读取XML文件
- spring事务PROPAGATION_REQUIRES_NEW和PROPAGATION_NESTED区别
- 修改jar中的class文件
- Yii2基础笔记(三):深入理解Yii2中的view
- 【连载】STM32开发指南--第四十二章 外部SRAM实验
- JSP基本语法--包含指令<%@include file="路径"%> <jsp:include page>