AsyncTask源码解读

AsyncTask源码解读

一、基本使用

protected void onPreExecute()
protected abstract Result doInBackground(Params... params)
protected void onPostExecute(Result result)
protected void onProgressUpdate(Progress... values)

二、AsyncTask源码分析

AsyncTask内部维护了一个线程池,用来执行后台任务,但是在不同的Android版本中,对线程池的配置也不同。

2.1 在Android 4.3之前

private static final int CORE_POOL_SIZE = 5; //核心线程数
private static final int MAXIMUM_POOL_SIZE = 128; //最大线程数
private static final int KEEP_ALIVE = 1; //超时时间,当线程数超过核心线程数时,超过这个时间的空线程就会被销毁,直到线程数等于核心线程

2.2 在Android4.4之后

private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
private static final int CORE_POOL_SIZE = CPU_COUNT + 1;
private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
private static final int KEEP_ALIVE = 1;

三、AsyncTask缺陷

  1. 线程池中的核心线程数太少,如果要执行异步任务比较多的时候会出现等待的问题
  2. 在4.3之前最大线程数为128,在4.4以后最大线程数跟CPU内核有关系

四、AsyncTask版本差异

  • CORE_POOL_SIZE MAXIMUM_POOL_SIZE KEEP_ALIVE在不同的版本上.值是不一样;
  • 1.5前是串行执行的,每次执行1个任务
  • 1.6-2.3之前的版本,是并行执行的,每次执行5个任务
  • 3.0后提供串行和并行,默认情况是串行
executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, null);//串行
executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);//并行

五、AsyncTask简单封装

/*---------------  抽取asynctask的基类 ---------------*/
abstract class BaseTask extends AsyncTask<Void, Void, Void> {
     IDataCallBack mDataCallBack;
     Event mEvent;

    /**
    * 通过构造方法初始化IDataCallBack
    * @param dataCallBack
    * @param reqCode 
    */
    public BaseTask(IDataCallBack dataCallBack, int reqCode) {
        super();
        mDataCallBack = dataCallBack;
        mEvent = new Event();
        mEvent.reqCode = reqCode;// 请求码赋值
    }

    @Override
    protected void onPostExecute(Void result) {
        // 需要用接口对象 传递数据
        mDataCallBack.handleServerData(mEvent.reqCode, mEvent.errCode, mEvent.data);
        super.onPostExecute(result);
      }
}

六、AsyncTask函数化的封装,AsyncTask函数式的调用

public class AsyncTaskUtils {
	public static <T> void doAsync(final IDataCallBack<T> callBack) {
		new AsyncTask<Void, Void, T>() {

			protected void onPreExecute() {
				callBack.onTaskBefore();
			};

			@Override
			protected T doInBackground(Void... params) {
				return callBack.onTasking(params);
			}

			protected void onPostExecute(T result) {
				callBack.onTaskAfter(result);
			};

		}.execute();
	}
}
posted @ 2017-05-25 11:43  喳喳的夏天  阅读(219)  评论(0编辑  收藏  举报