当前位置:首页 > 嵌入式 > 嵌入式软件
[导读] 在Android里需要大量后台操作的情况下,经常会使用到AsyncTask这个类,比如说加载网络图片,访问服务器的接口,一般的使用情境就是实例化一个AsyncTask的对象mTask,复写A

 在Android里需要大量后台操作的情况下,经常会使用到AsyncTask这个类,比如说加载网络图片,访问服务器的接口,一般的使用情境就是实例化一个AsyncTask的对象mTask,复写AsyncTask的抽象方法doinBackgroud等等,最后执行task.execute(params),然后就可以在UI线程上方便的取得后台线程的执行结果;

AsyncTask执行中最终触发的是把任务交给线池THREAD_POOL_EXECUTOR来执行,提交的任务并行的在线程池中运行,但这些规则在3.0之后发生了变化,3.0之后提交的任务是串行运行的,执行完一个任务才执行下一个!

先看看3.0以前的代码;

?

1
2
3
private static final int CORE_POOL_SIZE = 5;
private static final int MAXIMUM_POOL_SIZE = 128;
private static final int KEEP_ALIVE = 10;

?

1
 

?

1
 

?

1
public static final Executor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);

3.0以前线程池里核心线程有5个,同时存在的线程数最大不能超过128个,线程池里的线程都是并行运行的;

但是在3.0之后,直接调用execute(params)触发的是sDefaultExecutor的execute(runnable)方法,而不是原来的THREAD_POOL_EXECUTOR

?

1
2
3
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;

?

1
2
3
public static void execute(Runnable runnable) {
        sDefaultExecutor.execute(runnable);
    }

看看这个sDefaultExecutor与原来的THREAD_POOL_EXECUTOR线程池有什么 差别,sDefaultExecutor实际上是指向SerialExecutor的一个实例,从名字上看是一个顺序执行的executor;

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public static final Executor SERIAL_EXECUTOR = new SerialExecutor();
private static volatile Executor sDefaultExecutor = SERIAL_EXECUTOR;
 
 private static class SerialExecutor implements Executor {
        final ArrayDeque<runnable> mTasks = new ArrayDeque<runnable>();
        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);
            }
        }
    }</runnable></runnable>

分析SerialExecutor,当提交一个任务,执行一次execute(),向mTasks添加一个runnable,此时mActive为null,接着会执行scheduleNext(),将mActive指向刚刚添加的runbale,并提交到THREAD_POOL_EXECUTOR中执行,接着就线程池中就会执行下面这段代码;

?

1
2
3
4
5
try {
                        r.run();
                    } finally {
                        scheduleNext();
                    }

当asyncTask提交大量的任务时,会重复之前的流程,任务都添加至mTasks中了,提交第一个任务之后,mActive便不再为Null了,之后的任务如果要被执行就必需等到前一个任务run方法跑完,也就是try{ }语句块中的run(),前一个任务执行完后,才会调用finally

后面的scheduleNext()从mTasks中取出下一个任务来执行;

分析完上面的代码后,现在对于3.0以后AsyncTask默认情况下同时只存在一个线程顺序执行的原理就了解清楚了;

如果想要提交的任务在能并行执行呢?这在网络图片显示中还是比较有用的;

AsyncTask也为我们提供了另外一种启动方法

?

1
public final AsyncTask<params, result=""> executeOnExecutor(Executor exec,Params... params)</params,>

这里可以指定自定义的executor,而不再用SerialExecutor,如果乐意的话当然也可以直接使用用原本的THREAD_POOL_EXECUTOR,这样就可以保证多个任务并行执行了;

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

上海2026年3月19日 /美通社/ -- 2026世界一级方程式赛车锦标赛(以下简称F1)中国大奖赛正赛上周在上海国际赛车场落幕。作为F1官方物流合作伙伴,DHL与这项全球...

关键字: 可持续发展 BSP 供应链 环境影响

上海2026年3月19日 /美通社/ -- 三月春深,万物竞发,绿色生机成为各行各业高质量发展的鲜明底色。对于正处于深刻变革中的汽车产业而言,绿色发展不仅是趋势,更是驱动技术进化与价值重构的核心力量。中国汽车工...

关键字: 新能源汽车 轮胎 P10 BSP

北京2026年3月20日 /美通社/ -- 近年来,算力已成为驱动产业升级、支撑科技创新的核心生产力。作为全国一体化算力网络建设的重要参与者,软通智算聚焦算力网运营核心赛道,近期在三大国家枢纽节点接连取得突破性...

关键字: 节点 BSP 网络建设 全栈

北京2026年3月20日 /美通社/ -- 当前,人工智能正以前所未有的速度重塑各行各业,教育领域也迎来从知识灌输到素养培育的深刻变革。如何培养适应并引领未来的青少年,成为全社会共同关注的教育命题。 近日,中科院实验室...

关键字: 中科院 AI AI技术 BSP

上海2026年3月18日 /美通社/ -- 备受瞩目的3D打印行业盛会2026 TCT亚洲展今日拉开帷幕,将连续三天(3月17 - 19日)在国家会展中心(上海)7.1&8.1馆隆重上演。TCT亚洲展不...

关键字: TC INTRO BSP CAN

该奖项彰显了DXC的地位:作为可信赖的合作伙伴,助力全球企业实现现代化运营并推进AI应用 弗吉尼亚州阿什本2026年3月18日 /美通社/ -- 领先的企业技术与创新合作伙伴DXC Technology(纽约证券交易所...

关键字: 福布斯 AI BSP ST

北京2026年3月17日 /美通社/ -- 还在为每天淹没在碎片化的融资新闻里而头疼吗?担心错过关键赛道的早期信号?现在,有了更高效的办法。 亿欧刚刚为OpenClaw(小龙虾)生态,带来了一个"专...

关键字: SKILL AI AGENT BSP

西门子旗舰科技大会首发中国,打造AI时代科技交流、生态开放新平台 董事会主席、总裁兼首席执行官博乐仁(Roland Busch)将发表主旨演讲,与阿里巴巴集团主席蔡崇信,宇树科技创始人、董事长兼首席执行官王兴兴...

关键字: 西门子 AI BSP NVIDIA

广州2026年3月16日 /美通社/ -- 近日,全球领先的第三方专业检验检测认证机构 DEKRA 德凯正式授予中汽研汽车检验中心(广州)有限公司(下称 "广州检验...

关键字: 汽车 镍氢电池 电池检测 BSP

上海2026年3月13日 /美通社/ --  家电盛会里的"天外来客" 在2026年中国家电及消费电子博览会(AWE)的聚光灯下,当众多参展商聚焦于展示扫地机器人的吸力性能或洗碗机的...

关键字: BSP 卫星 芯片 手机
关闭