?關(guān)于android并發(fā)
AsyncTask在android2.3的時候線程池是一個核心數(shù)為5線程,隊(duì)列可容納10線程,最大執(zhí)行128個任務(wù),這存在一個問題,當(dāng)你真的有138個并發(fā)時,即使手機(jī)沒被你撐爆,那么超出這個指標(biāo)應(yīng)用絕對crash掉。 后來升級到4.0,為了避免并發(fā)帶來的一些列問題,AsyncTask竟然成為序列執(zhí)行器了,也就是你即使你同時execute N個AsyncTask,它也是挨個排隊(duì)執(zhí)行的。 這一點(diǎn)請同學(xué)們一定注意,AsyncTask在4.0以后,是異步的沒錯,但不是并發(fā)的。使用系統(tǒng)的AsyncTask過程中,cancel方法也會出現(xiàn)停止不了的異常,遇到多任務(wù)網(wǎng)絡(luò)處理時,會出現(xiàn)線程混亂的情況。
異步任務(wù)AsyncTask核心
并發(fā)量的設(shè)置,默認(rèn)為當(dāng)前手機(jī)的CPU個數(shù)
private static int CPU_COUNT=Runtime.getRuntime().availableProcessors();
聲明一個FutureTask的計算任務(wù),并定義實(shí)現(xiàn)Callable的WorkerRunnable
private static abstract class WorkerRunnable?implements Callable {?Params[]mParams;?}

如圖一所示,最后任務(wù)在call()方法中被執(zhí)行。
其中核心是定義一個任務(wù)調(diào)度模塊,可以自定義一個如下的簡易調(diào)度器,并調(diào)用剛才的mFuture。
Executor mSmartExecutor = Executors.newFixedThreadPool(4);
exec.execute(mFuture);
此調(diào)度器支持同時處理4個任務(wù),之后的任務(wù)需等待執(zhí)行。
當(dāng)然,有些場景這個調(diào)度器并不能發(fā)揮作用。當(dāng)出現(xiàn)瞬間大量并發(fā)的場景,比如,假設(shè)用戶拖動時如果需要啟動大量異步線程,而拖動過去時間很久的用戶已經(jīng)看不到,這時候就允許之前圖片加載的任務(wù)丟失。它大大改善Android自帶異步任務(wù)框架的處理能力和速度。默認(rèn)地,它使用LIFO(后進(jìn)先出)策略來調(diào)度線程,可將最新的任務(wù)快速執(zhí)行,當(dāng)然你自己可以換為FIFO調(diào)度策略。這有助于用戶當(dāng)前任務(wù)優(yōu)先完成(比如加載圖片時,很容易做到當(dāng)前屏幕上的圖片優(yōu)先加載)。

此圖定義了一個用于特殊場景的調(diào)度器。
注意:AsyncTask中的調(diào)度器變量需用static修飾,若不然,每次新建AsyncTask都會新建一個線程池,而AsyncTask的核心是公用一個調(diào)度器。
public static final Executor mLruSerialExecutor=new SmartSerialExecutor();
當(dāng)task執(zhí)行完doInBackground方法后,定義InternalHandler去處理返回值

最后實(shí)現(xiàn)FinishedListener,讓用戶處理結(jié)果。
AsyncTask的衍生擴(kuò)展
SafeTask:安全異步任務(wù),可以捕獲任意異常,并反饋給給開發(fā)者。
SimpleTask:簡單的異步任務(wù),僅僅指定返回結(jié)果的類型,不可輸入?yún)?shù).
CachedTask:主要用于獲取網(wǎng)絡(luò)數(shù)據(jù),給它一個緩存時間,只要未超時,它將先從本地獲取,僅當(dāng)超時或本地獲取失敗時才去真正聯(lián)網(wǎng)完成。