日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式軟件
[導(dǎo)讀] 在Android里需要大量后臺操作的情況下,經(jīng)常會使用到AsyncTask這個類,比如說加載網(wǎng)絡(luò)圖片,訪問服務(wù)器的接口,一般的使用情境就是實例化一個AsyncTask的對象mTask,復(fù)寫A

 在Android里需要大量后臺操作的情況下,經(jīng)常會使用到AsyncTask這個類,比如說加載網(wǎng)絡(luò)圖片,訪問服務(wù)器的接口,一般的使用情境就是實例化一個AsyncTask的對象mTask,復(fù)寫AsyncTask的抽象方法doinBackgroud等等,最后執(zhí)行task.execute(params),然后就可以在UI線程上方便的取得后臺線程的執(zhí)行結(jié)果;

AsyncTask執(zhí)行中最終觸發(fā)的是把任務(wù)交給線池THREAD_POOL_EXECUTOR來執(zhí)行,提交的任務(wù)并行的在線程池中運行,但這些規(guī)則在3.0之后發(fā)生了變化,3.0之后提交的任務(wù)是串行運行的,執(zhí)行完一個任務(wù)才執(zhí)行下一個!

先看看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個,同時存在的線程數(shù)最大不能超過128個,線程池里的線程都是并行運行的;

但是在3.0之后,直接調(diào)用execute(params)觸發(fā)的是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的一個實例,從名字上看是一個順序執(zhí)行的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,當(dāng)提交一個任務(wù),執(zhí)行一次execute(),向mTasks添加一個runnable,此時mActive為null,接著會執(zhí)行scheduleNext(),將mActive指向剛剛添加的runbale,并提交到THREAD_POOL_EXECUTOR中執(zhí)行,接著就線程池中就會執(zhí)行下面這段代碼;

?

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

當(dāng)asyncTask提交大量的任務(wù)時,會重復(fù)之前的流程,任務(wù)都添加至mTasks中了,提交第一個任務(wù)之后,mActive便不再為Null了,之后的任務(wù)如果要被執(zhí)行就必需等到前一個任務(wù)run方法跑完,也就是try{ }語句塊中的run(),前一個任務(wù)執(zhí)行完后,才會調(diào)用finally

后面的scheduleNext()從mTasks中取出下一個任務(wù)來執(zhí)行;

分析完上面的代碼后,現(xiàn)在對于3.0以后AsyncTask默認(rèn)情況下同時只存在一個線程順序執(zhí)行的原理就了解清楚了;

如果想要提交的任務(wù)在能并行執(zhí)行呢?這在網(wǎng)絡(luò)圖片顯示中還是比較有用的;

AsyncTask也為我們提供了另外一種啟動方法

?

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

這里可以指定自定義的executor,而不再用SerialExecutor,如果樂意的話當(dāng)然也可以直接使用用原本的THREAD_POOL_EXECUTOR,這樣就可以保證多個任務(wù)并行執(zhí)行了;

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關(guān)閉