本章我们来理解一下AsyncTask工作原理

AsyncTask.javaprivate 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());}};private static final BlockingQueue sPoolWorkQueue =    new LinkedBlockingQueue(128);/*** An {@link Executor} that can be used to execute tasks in parallel.*/public static final Executor THREAD_POOL_EXECUTOR;static {ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(        CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE_SECONDS, TimeUnit.SECONDS,        sPoolWorkQueue, sThreadFactory);threadPoolExecutor.allowCoreThreadTimeOut(true);THREAD_POOL_EXECUTOR = threadPoolExecutor;}/*** An {@link Executor} that executes tasks one at a time in serial* order.  This serialization is global to a particular process.*/public static final Executor SERIAL_EXECUTOR = new SerialExecutor();private static volatile Executor sDefaultExecutor = SERIAL_EXECUTOR;private final WorkerRunnable mWorker;private final FutureTask mFuture;private volatile Status mStatus = Status.PENDING;private static class SerialExecutor implements Executor {final ArrayDeque mTasks = new ArrayDeque();Runnable mActive;public synchronized void execute(final Runnable r) {    mTasks.offer(new Runnable() {        public void run() {            try {                r.run();            } finally {                scheduleNext();            }        }    });    if (mActive == null) {        scheduleNext();    }}protected synchronized void scheduleNext() {    if ((mActive = mTasks.poll()) != null) {        THREAD_POOL_EXECUTOR.execute(mActive);    }}

1、AsyncTask里面使用了static类型的处理器:THREAD_POOL_EXECUTOR(ThreadPoolExecutor),一个process共享这同一个
2、使用了SerialExecutor把要处理的task进行压入队列,所以使用AsyncTask进行异步任务时,一次只能运行一个task

 @MainThreadpublic final AsyncTask execute(Params... params) {    return executeOnExecutor(sDefaultExecutor, params);} @MainThreadpublic static void execute(Runnable runnable) {    sDefaultExecutor.execute(runnable);}@MainThreadpublic final AsyncTask executeOnExecutor(Executor exec,    Params... params) {if (mStatus != Status.PENDING) {    switch (mStatus) {        case RUNNING:            throw new IllegalStateException("Cannot execute task:"                    + " the task is already running.");        case FINISHED:            throw new IllegalStateException("Cannot execute task:"                    + " the task has already been executed "                    + "(a task can be executed only once)");    }}mStatus = Status.RUNNING;onPreExecute();mWorker.mParams = params;exec.execute(mFuture);return this;}

所以,由上面的分析可以知道,在使用AsyncTask的时候,请避免处理一些及时的task,因为同时处理一个以上的task时,AsyncTask是窜行的,非并行的。

更多相关文章

  1. 强强学Android_Android事件传递
  2. Android(安卓)使用事物处理
  3. Android中Dialog对话框使用总结及demo
  4. android 內存等使用情況(转)
  5. Android自动化工具Monkeyrunner使用(六) —— touch
  6. android + eclipse + 后台静默安装(一看就会)
  7. 箭头函数的基础使用
  8. NPM 和webpack 的基础使用
  9. Python list sort方法的具体使用

随机推荐

  1. 关于打印日志的使用
  2. Android Intent和按钮响应事件的几种方式
  3. android实现开机自启动服务
  4. android4.3应用程序隐藏状态栏和标题栏
  5. Android 程序退出的办法
  6. 地图入门(一):Android上使用Google Maps加标
  7. android图形系统详解二:Drawables
  8. Android中的DownloadManager
  9. Android之使用传感器获取相应数据
  10. android定时任务实现