一.什么是AsyncTask
它本质上是封装了线程池和handler的异步框架,主要执行异步任务
二.AsyncTask的用法
public class UpdateInfoAsyncTask extends AsyncTask<Integer,Integer,String>{
private TextView textView;
private ProgressBar progressBar;
public UpdateInfoAsyncTask(TextView textView, ProgressBar progressBar) {
this.textView = textView;
this.progressBar = progressBar;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
textView.setText("UI线程,开始执行 ");
}
@Override
protected String doInBackground(Integer... params) {
int i;
for (i=10;i<=100;i+=10){
//发送当前 进度
publishProgress(i);
}
return i+params[0].intValue()+"";
}
/**
* 当前进度
* @param values
*/
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
int vlaue =values[0];
progressBar.setProgress(vlaue);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
textView.setText("异步操作执行结果返回"+s);
}
}
三.AsyncTask的机制原理
![](https://img.haomeiwen.com/i2103243/55fa15e0a3a0a2cb.png)
四.AsyncTask的的注意事项
1.内存泄漏
解决方法和hander类似 可以把AsyncTask设置为静态的 ,弱引用
onDestroy中调用 cancel(boolean)方法取消任务
2.生命周期
不会随着activity 的销毁而销毁,需要调用cancel方法 ,保证程序稳定
没有取消可能会崩溃 因为ui线程依托的activity已销毁了
3.结果丢失
由于屏幕旋转和 内存不够结果被杀掉 ,activity重新启动
AsyncTask会持有之前activity的引用,引用无效,会导致 publishProgress 更新无效
4.串行or并行
做不了太高并发,太耗时的操作
1.6版本以前 是串行
1.6到2.3是并行
2.3以后 默认串行 可以调用 executeOnExecutor(Executor)来执行并行(不建议并行)0
最简单的方法法就是使用executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, Params... params)
网友评论