• 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();
    	}
    }
    
  • 相关阅读:
    使用VisualStudio进行单元测试之二
    使用VisualStudio进行单元测试之一
    ExtJS监听键盘事件:回车键实现登录功能
    PPTP无法连网
    Android深度探索.
    Android深度探索
    Android驱动开发
    window.open()的具体使用方法
    js控制的几种页面跳转和传值(转载)
    Hatching shader
  • 原文地址:https://www.cnblogs.com/coderwjq/p/6902922.html
Copyright © 2020-2023  润新知