您的位置:首页 > 其它

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: