AsyncTask模拟进度条

来源:互联网 发布:一搜影咖软件 编辑:程序博客网 时间:2024/05/20 15:56
现在开始一个稍微复杂点点的示例,用异步AsyncTask来模拟进度条
1. 布局文件,就放一个ProgressBar
AsyncTask模拟进度条
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模拟进度条


总结
AsyncTask注意事项:
1. 必须在UI线程中创建AsyncTask的实例
2. 必须在UI线程中调用AsyncTask的execute()方法
3. 重写的四个方法是系统自动调用的,不应该手动调用
4. 每个AsyncTask只能被执行一次,多次调用将会引发异常
5.四个方法中,doInBackground()是运行在其他线程的,是做异步处理的,不能直接更新UI,其他的方法都是运行在UI线程的,可以用来更新UI
0 0
原创粉丝点击