AsyncTask

AsyncTask

十一月 07, 2017

AsyncTask

1. 什么是 AsyncTask

1.1 AsyncTask 是安卓提供的轻量异步类(抽象), 可以继承AsyncTask,在类中可以进行异步操作, 并提供接口反馈当前异步执行的程度或进度。

本质上就是一个封装了线程池和handler的异步框架,主要用来执行异步任务,由于集成了handler,通过handler发送消息,它很方便的在工作线程和UI线程之间切换
(最好做耗时比较短的,长的还是用线程池)

2. AsyncTask的使用方法

2.1 三个参数

1
2
3
4
5
6
7
8
9
10
11
12
13
public abstract class AsyncTask<Params, Progress, Result> {
private static final String LOG_TAG = "AsyncTask";
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
// We want at least 2 threads and at most 4 threads in the core pool, // preferring to have 1 less than the CPU count to avoid saturating // the CPU with background work private static final int CORE_POOL_SIZE = Math.max(2, Math.min(CPU_COUNT - 1, 4));
private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
private static final int KEEP_ALIVE_SECONDS = 30;
private static final ThreadFactory sThreadFactory = new ThreadFactory() {
private final AtomicInteger mCount = new AtomicInteger(1);
public Thread newThread(Runnable r) {
return new Thread(r, "AsyncTask #" + mCount.getAndIncrement());
}
};

Params:执行时传入的参数;
Progress:在后台执行时的进度;
Result:当任务执行完毕后的结果返回;


2.2 五个方法

耗时操作没进行前,在UI线程汇中调用onPreExecute();

1
2
3
@MainThread
protected void onPreExecute() {
}

在后台执行时调用doInBackground();计算结果必须有一个返回,并会被传到onPost()中;
也可以调用publishProgress();返回进度显示
@WorkerThread
protected abstract Result doInBackground(Params… params);
在每次onProgressUpdate()调用完后会执行onProgressUpdate();通过progressbar.setProgress(value)动态显示进度条;

1
2
3
@MainThread
protected void onProgressUpdate(Progress... values) {
}

最后所有doInBackground之后会通过result来传递给onPostExecute()并调用;

1
2
3
@MainThread
protected void onPostExecute(Result result) {
}

3. AsyncTask内部原理

3.1 AsyncTask的本质是一个静态的线程池,AsyncTask派生出的子类可以实现不同的异步任务, 这些任务都是提交到静态的线程池中执行;

3.2 线程池中的工作线程执行doInBackground(mParans)方法执行异步任务;

3.3 当任务状态改变之后,工作线程会向UI线程发送消息,AsyncTask内部的InternalHandler响应这些消息, 并调用相关的回调函数;

4. AsyncTask注意事项

4.1 内存泄露

被声明为Activity的非静态的内部类,会持有外部类的引用;

设为静态 static;
或者持有弱引用;
或在外部onDestroy里用cancle;

4.2 生命周期
必须在activity生命周期销毁时销毁AsyncTask

4.3 结果丢失原因

如被杀掉,或者屏幕旋转时onPostExcute不会更新界面

4.4 并行OR串行

版本 执行方式
<= 1.6 串行
>= 1.6 && < 2.3 并行
>= 2.3 串行