- 一个Android 已封装好的轻量级异步类。属于抽象类,即使用时需实现子类。同时方便在子线程更新UI。封装了Handler和两个线程池。
一、使用详解
(1)方法介绍
- onPreExecute:在主线程执行,异步任务执行前调用做准备工作
- doInBackground:在线程池中执行,用于执行异步任务。
- onProgressUpdate:在主线程执行,后台任务执行进度发生变化会调用此方法。
- onPostExecute:在主线程执行,接收任务执行结果,将执行结果显示到UI组件。
- onCancelled:当异步任务取消时调用,而这时候onPostExecute不会被调用。
(2)方法执行顺序
- 基础使用:execute() → onPreExecute() → doInBackground() → onPostExecute()
- 显示进度:execute() → onPreExecute() → doInBackground() → onProgressUpdate() → onPostExecute()
- 终止执行任务:execute() → onPreExecute() → doInBackground() → onCancelled()
二、AsyncTask使用
(1)AsyncTask子类实现
public class MyAsyncTask extends AsyncTask<String, Integer, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
Log.v("MyAsyncTask", "准备加载");
}
@Override
protected String doInBackground(String... strings) {
try {
int count = 0;
while (count < 99) {
count ++;
publishProgress(count);
//模拟耗时任务
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
Log.v("MyAsyncTask", "已加载" + values[0] + "%");
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
Log.v("MyAsyncTask", "加载完毕");
}
@Override
protected void onCancelled() {
super.onCancelled();
Log.v("MyAsyncTask", "取消加载");
}
}
(2)调用代码
MyAsyncTask asyncTask = new MyAsyncTask();
asyncTask.execute();//开始加载
asyncTask.cancel(true);//取消加载
优点
- 方便实现异步通信:不需使用 “任务线程(继承Thread类) + Handler”的复杂组合
- 节省资源:采用线程池的缓存线程 + 复用线程,避免了频繁创建 & 销毁线程所带来的系统资源开销
缺点
- 多个异步操作需要更新UI时,就变得麻烦起来。
注意事项
- AsyncTask对象必须在主线程实例化,类必须在主线程加载;execute()方法必须在UI线程调用。
- 一个AsyncTask对象只能执行一次,即只能调用一次execute方法,否则报运行时异常
- 若AsyncTask被声明为Activity的非静态内部类,当Activity需销毁时,会因AsyncTask保留对Activity的引用而导致Activity无法被回收,最终引起内存泄露。
- 线程任务执行结果丢失,当Activity重新创建时之前运行的AsyncTask持有的之前Activity引用已无效,故复写的onPostExecute()将不生效,即无法更新UI操作。
网友评论