Update AsyncTask And Make New One

?關(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;?}

圖1

如圖一所示,最后任務(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)先加載)。

圖2

此圖定義了一個用于特殊場景的調(diào)度器。

注意:AsyncTask中的調(diào)度器變量需用static修飾,若不然,每次新建AsyncTask都會新建一個線程池,而AsyncTask的核心是公用一個調(diào)度器。

public static final Executor mLruSerialExecutor=new SmartSerialExecutor();

當(dāng)task執(zhí)行完doInBackground方法后,定義InternalHandler去處理返回值

圖3

最后實(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)完成。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 什么是線程池?為什么要用線程池?Java中的線程池是運(yùn)用場景最多的并發(fā)框架,幾乎所有需要異步或并發(fā)執(zhí)行任務(wù)的程序都...
    stevefat閱讀 522評論 0 0
  • AsyncTask 是一個簡單實(shí)用的多線程異步任務(wù)工具類。 Android 開發(fā)中經(jīng)常遇到需要將耗時的操作放到子線...
    HJDaryl閱讀 804評論 0 1
  • AsyncTask 簡介 在 Android 中執(zhí)行耗時任務(wù)時,我們一般不直接自己 new 一個 Thread,而...
    Kip_Salens閱讀 438評論 0 3
  • 由于從wordpress將文章倒回,發(fā)現(xiàn)格式有點(diǎn)混亂,經(jīng)努力調(diào)整后依然有部分的格式還未調(diào)教好,請多多包涵. 分析A...
    walker_lee0707閱讀 1,337評論 3 51
  • 山上有一種樹木,平時看來無奇,但到春夏交替之時,便會長出許多類似碗豆莢之類的果實(shí),一個枝頭上能掛四五個,甚至更多。...
    徐徐如秋閱讀 529評論 2 2

友情鏈接更多精彩內(nèi)容