AsyncTask源码解读
2024-10-09 06:27:52
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缺陷
- 线程池中的核心线程数太少,如果要执行异步任务比较多的时候会出现等待的问题
- 在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();
}
}
最新文章
- SWM格式稀疏权重矩阵转换为方阵形式全过程分享
- android WebView总结
- 01.AFNetworking原理及常用操作
- Implicit Object in JSP
- hdu 4198 Quick out of the Harbour
- javascript高级编程运用
- Java 集合 LinkedList的ListIterator
- 转:Jmeter常见问题 (转载) http://www.51testing.com/?uid-128005-action-viewspace-itemid-84094
- C# winform项目中ListView控件使用CheckBoxes属性实现单选功能
- django无法加载admin的静态内容的问题(Centos7+Nginx+uwsgi环境下)
- 我的IdentityServer目录
- 通过一篇YAML来学习YAML
- 查出了a表,然后对a表进行自查询,a表的别名t1,t2如同两张表,因为t1,t2查询的条件不一样,真的如同两张表,关联两张表,可以将两行或者多行数据合并成一行,不必使用wm_concat()函数。为了将t2表的数据全部查出来使用了右连接。
- (转)Geth控制台使用及Web3.js使用实战
- Java常用API-高级
- MVC 2nd
- set_error_handler
- (转载)ACM训练计划,先过一遍基础再按此拼搏吧!!!!
- Cent OS 常用命令搜集
- Haskell语言学习笔记(54)Data.Set
热门文章
- 科技感满满,华为云DevCloud推出网页暗黑模式
- Typora + Powershell/bash + Git搭建自己的笔记
- Appium自动化(4) - Appium Desired Capabilities 参数详解
- Java 如何实现优雅停服?刨根问底
- 「雕爷学编程」Arduino动手做(41)---激光接收管模块
- Spark_Transformation和Action算子
- chrome ";items hidden by filters";
- Django之ORM中事务和锁
- 机器学习决策树ID3算法,手把手教你用Python实现
- IDEA图标大全