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();
}
}

最新文章

  1. SWM格式稀疏权重矩阵转换为方阵形式全过程分享
  2. android WebView总结
  3. 01.AFNetworking原理及常用操作
  4. Implicit Object in JSP
  5. hdu 4198 Quick out of the Harbour
  6. javascript高级编程运用
  7. Java 集合 LinkedList的ListIterator
  8. 转:Jmeter常见问题 (转载) http://www.51testing.com/?uid-128005-action-viewspace-itemid-84094
  9. C# winform项目中ListView控件使用CheckBoxes属性实现单选功能
  10. django无法加载admin的静态内容的问题(Centos7+Nginx+uwsgi环境下)
  11. 我的IdentityServer目录
  12. 通过一篇YAML来学习YAML
  13. 查出了a表,然后对a表进行自查询,a表的别名t1,t2如同两张表,因为t1,t2查询的条件不一样,真的如同两张表,关联两张表,可以将两行或者多行数据合并成一行,不必使用wm_concat()函数。为了将t2表的数据全部查出来使用了右连接。
  14. (转)Geth控制台使用及Web3.js使用实战
  15. Java常用API-高级
  16. MVC 2nd
  17. set_error_handler
  18. (转载)ACM训练计划,先过一遍基础再按此拼搏吧!!!!
  19. Cent OS 常用命令搜集
  20. Haskell语言学习笔记(54)Data.Set

热门文章

  1. 科技感满满,华为云DevCloud推出网页暗黑模式
  2. Typora + Powershell/bash + Git搭建自己的笔记
  3. Appium自动化(4) - Appium Desired Capabilities 参数详解
  4. Java 如何实现优雅停服?刨根问底
  5. 「雕爷学编程」Arduino动手做(41)---激光接收管模块
  6. Spark_Transformation和Action算子
  7. chrome &quot;items hidden by filters&quot;
  8. Django之ORM中事务和锁
  9. 机器学习决策树ID3算法,手把手教你用Python实现
  10. IDEA图标大全