亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統(tǒng) > Android > 正文

Android AsyncTask源碼分析

2019-12-12 06:41:29
字體:
供稿:網(wǎng)友

Android中只能在主線程中進(jìn)行UI操作,如果是其它子線程,需要借助異步消息處理機(jī)制Handler。除此之外,還有個(gè)非常方便的AsyncTask類,這個(gè)類內(nèi)部封裝了Handler和線程池。本文先簡(jiǎn)要介紹AsyncTask的用法,然后分析具體實(shí)現(xiàn)。

基本用法
AsyncTask是一個(gè)抽象類,我們需要?jiǎng)?chuàng)建子類去繼承它,并且重寫一些方法。AsyncTask接受三個(gè)泛型參數(shù):

Params: 指定傳給任務(wù)執(zhí)行時(shí)的參數(shù)的類型
Progress: 指定后臺(tái)任務(wù)執(zhí)行時(shí)將任務(wù)進(jìn)度返回給UI線程的參數(shù)類型
Result: 指定任務(wù)完成后返回的結(jié)果的類型
除了指定泛型參數(shù),還需要根據(jù)需要重寫一些方法,常用的如下:

onPreExecute(): 這個(gè)方法在UI線程調(diào)用,用于在任務(wù)執(zhí)行前做一些初始化操作,如在界面上顯示加載進(jìn)度控件
doInBackground: 在onPreExecute()結(jié)束之后立刻在后臺(tái)線程調(diào)用,用于耗時(shí)操作。在這個(gè)方法中可調(diào)用publishProgress方法返回任務(wù)的執(zhí)行進(jìn)度
onProgressUpdate: 在doInBackground調(diào)用publishProgress后被調(diào)用,工作在UI線程
onPostExecute: 后臺(tái)任務(wù)結(jié)束后被調(diào)用,工作在UI線程
源碼分析
下面分析這個(gè)類的實(shí)現(xiàn),主要有線程池以及Handler兩部分。

1、線程池
當(dāng)執(zhí)行一個(gè)AsyncTask的時(shí)候調(diào)用的是execute()方法,就從這個(gè)開始看:

public final AsyncTask<Params, Progress, Result> execute(Params... params){ return executeOnExecutor(sDefaultExecutor, params);}public final AsyncTask<Params, Progress, Result> 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;  //先執(zhí)行 onPreExecute onPreExecute();   mWorker.mParams = params;   exec.execute(mFuture);  return this; } 

execute方法會(huì)調(diào)用executeOnExecutor。在這個(gè)方法中先檢查任務(wù)是否已經(jīng)執(zhí)行或者執(zhí)行結(jié)束,然后把任務(wù)標(biāo)記為running。最開始執(zhí)行的是onPreExecute,接著把參數(shù)賦值給mWorker對(duì)象。這個(gè)mWorker是一個(gè)Callable對(duì)象,最終被包裝為FutureTask,代碼如下:

private static abstract class WorkerRunnable<Params, Result> implements Callable<Result> {  Params[] mParams; } mWorker = new WorkerRunnable<Params, Result>() {   public Result call() throws Exception {    mTaskInvoked.set(true);    Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);    //noinspection unchecked    return postResult(doInBackground(mParams));   }  }; mFuture = new FutureTask<Result>(mWorker) {  @Override  protected void done() {   try {    postResultIfNotInvoked(get());   } catch (InterruptedException e) {    android.util.Log.w(LOG_TAG, e);   } catch (ExecutionException e) {    throw new RuntimeException("An error occured while executing doInBackground()",      e.getCause());   } catch (CancellationException e) {    postResultIfNotInvoked(null);   }  } }; 

從上面的代碼可以看出,在mWorker對(duì)象中的call()方法會(huì)調(diào)用doInbackground,返回值交給postResult方法,這個(gè)方法通過Handler發(fā)送消息,這一點(diǎn)稍后再詳細(xì)分析。

在mWorker對(duì)象被封裝成FutureTask之后交由線程池執(zhí)行,從execute方法可以看出,使用的是sDefaultExecutor,它的值默認(rèn)為SERIAL_EXECUTOR,也就是串行執(zhí)行器,實(shí)現(xiàn)如下:

 private static class SerialExecutor implements Executor {  //線性雙向隊(duì)列,用來存儲(chǔ)所有的AsyncTask任務(wù)  final ArrayDeque<Runnable> mTasks = new ArrayDeque<Runnable>();  //當(dāng)前正在執(zhí)行的AsyncTask任務(wù)  Runnable mActive;  public synchronized void execute(final Runnable r) {   //將新的AsyncTask任務(wù)加入到雙向隊(duì)列中   mTasks.offer(new Runnable() {    public void run() {     try {      //執(zhí)行AsyncTask任務(wù)      r.run();     } finally {      //當(dāng)前任務(wù)執(zhí)行結(jié)束后執(zhí)行下一個(gè)任務(wù)     scheduleNext();     }    }   });   if (mActive == null) {    scheduleNext();   }  }  protected synchronized void scheduleNext() {   //從任務(wù)隊(duì)列中取出隊(duì)列頭部的任務(wù),如果有就交給并發(fā)線程池去執(zhí)行   if ((mActive = mTasks.poll()) != null) {    THREAD_POOL_EXECUTOR.execute(mActive);   }  } }public static final Executor THREAD_POOL_EXECUTOR   = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,     TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory); 

在上面的代碼中,如果有任務(wù)執(zhí)行,那么SerialExecutor的execute方法會(huì)被調(diào)用,它的邏輯是把Runnable對(duì)象加入ArrayDeque隊(duì)列中,然后判斷mActivie是否為空。第一次執(zhí)行時(shí)mActive當(dāng)然為空,所以執(zhí)行scheduleNext,其實(shí)就是取出任務(wù)隊(duì)列中的第一個(gè)任務(wù)交給線程池(THREAD_POOL_EXECUTOR)執(zhí)行。加入mTask隊(duì)列的Runnable對(duì)象的run方法里最終一定會(huì)調(diào)用scheduleNext,那么又會(huì)從任務(wù)隊(duì)列中取出隊(duì)頭任務(wù)執(zhí)行。這樣便實(shí)現(xiàn)了單線程順序執(zhí)行任務(wù),所以在AsyncTask中默認(rèn)啟用的是單線程執(zhí)行,只有上一個(gè)任務(wù)執(zhí)行后才會(huì)執(zhí)行下一個(gè)任務(wù)。如果想要啟用多線程執(zhí)行任務(wù),可以直接調(diào)用 executeOnExecutor(Executor exec,  Params... params),這里的Executor參數(shù)可以使用AsyncTask自帶的THREAD_POOL_EXECUTOR,也可以自己定義。

2、Handler
AsyncTask內(nèi)部用Handler傳遞消息,它的實(shí)現(xiàn)如下:

private static class InternalHandler extends Handler {  @SuppressWarnings({"unchecked", "RawUseOfParameterizedType"})  @Override  public void handleMessage(Message msg) {   AsyncTaskResult result = (AsyncTaskResult) msg.obj;   switch (msg.what) {    case MESSAGE_POST_RESULT:     // There is only one result     result.mTask.finish(result.mData[0]);     break;    case MESSAGE_POST_PROGRESS:     result.mTask.onProgressUpdate(result.mData);     break;   }  } } 

如果消息類型是任務(wù)執(zhí)行后的返回值(MESSAGE_POST_RESULT)將調(diào)用finish()方法:

private void finish(Result result) {  if (isCancelled()) {   onCancelled(result);  } else {   onPostExecute(result);  }  mStatus = Status.FINISHED; } 

從上面可以知道,如果任務(wù)取消了,將調(diào)用onCancelled,否則調(diào)用onPostExecute,所以一個(gè)AsyncTask任務(wù)如果取消了,那么onPostExecute將不會(huì)得到執(zhí)行。

如果消息類型是執(zhí)行進(jìn)度(MESSAGE_POST_PROGRESS)將調(diào)用onProgressUpdate,這個(gè)方法默認(rèn)是空方法,我們可以根據(jù)自己的需要重寫。

總結(jié)
AsyncTask的主要邏輯就如上面所分析的,總結(jié)幾個(gè)需要注意的地方:

      1)、 AsyncTask的類必須在UI線程加載(從4.1開始系統(tǒng)會(huì)幫我們自動(dòng)完成)
      2)、  AsyncTask對(duì)象必須在UI線程創(chuàng)建
      3)、  execute方法必須在UI線程調(diào)用
      4)、  不要手動(dòng)調(diào)用onPreExecute()、doInBackground、onProgressUpdate方法
      5)、  一個(gè)任務(wù)只能被調(diào)用一次(第二次調(diào)用會(huì)拋出異常)

其它還有一些細(xì)節(jié)可以自行研究源碼,另外推薦幾篇不錯(cuò)的文章:

Android AsyncTask完全解析,帶你從源碼的角度徹底理解

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
欧美高清视频一区二区三区在线观看| 97在线视频免费观看完整版| 亚洲蜜桃视频| 熟女少妇内射日韩亚洲| a视频免费观看| 香蕉免费毛片视频| 97电影在线| 国产精区一区二区| 伊人国产在线视频| 2020日本不卡一区二区视频| 日韩国产在线观看一区| 国严精品久久久久久亚洲影视| 免费成人黄色| 欧美日韩视频在线一区二区观看视频| 黄色毛片在线| 欧美女人交a| а√天堂www在线а√天堂视频| 久久国产主播| 国产午夜精品久久久| a级毛片免费观看在线| 男女污污视频在线观看| 一区二区免费在线观看| 欧美一级久久久| 高清视频在线观看三级| 欧美亚洲日本| 精油按摩中文字幕久久| 最新版天堂中文在线官网| 日韩免费在线免费观看| 国产一区二区三区精品久久久| 欧美性感美女h网站在线观看免费| 亚洲欧美日韩久久| 国产精品美女一区二区在线观看| 久久久在线免费观看| 国产精品香蕉| 国产经典一区| 午夜羞羞视频| 男人精品网站一区二区三区| 杨幂一区欧美专区| 亚洲色图另类图片| 午夜精品中文字幕| 久草视频在线免费| 91香蕉视频在线下载| 男女性激情视频在线观看| 小小女视频网站色琼网站| 欧美丰满艳妇bbwbbw| 思思99re6国产在线播放| 一区二区三区美女视频| 狠狠色丁香久久婷婷综合丁香| 亚洲偷欧美偷国内偷| 亚洲国产精品免费视频| 欧美国产精品一区二区三区| 亚洲成人第一区| 欧美**字幕| 国产女人18毛片水真多18| 91色在线播放| 日韩av懂色| 国产白袜脚足j棉袜在线观看| 天堂中文在线观看视频| 无码任你躁久久久久久久| 欧美白人做受xxxx视频| 亚洲一区二区三区四区电影| 九九精品在线观看| 亚洲精品视频在线观看免费| 国产成人精品一区二区在线小狼| 欧美久久精品一级c片| 久久亚洲美女| 丰满亚洲少妇av| blacked蜜桃精品一区| 激情综合色丁香一区二区| 搡老熟女老女人一区二区| 中文在线免费二区三区| 国内外成人免费激情在线视频网站| 亚洲精品不卡在线| 在线观看日本中文字幕| 五月婷婷之综合激情| 欧美中日韩一区二区三区| 午夜av入18在线| 欧美性受xxxx白人性爽| 亚洲人成精品久久久| 国产97在线观看| 欧美日本一区二区在线观看| 国产精品入口麻豆原神| av小片在线| 亚洲高清视频中文字幕| 色婷婷国产精品综合在线观看| 欧美性猛xxx| 青青艹在线视频| 国产精品毛片大码女人| 日韩美女在线看免费观看| 欧美黄色录像片| 女教师高潮黄又色视频| 日本高清视频网站| 国产亚洲自拍一区| 午夜视频一区在线观看| 97人妻天天摸天天爽天天| 久久国产精品免费看| 国内精品久久久久久久久久久| 视频在线观看入口黄最新永久免费国产| 日本中文字幕片| 亚洲第一av网| 国产在线一二三区| 美女精品国产| 残酷重口调教一区二区| 国产亚洲欧美精品久久久www| 精品av在线播放| 中文字幕欧美日韩精品| 任我爽在线视频精品一| 午夜激情视频在线| 大胆av不用播放器在线播放| 亚洲6080在线| 污污动漫在线观看| 欧美在线关看| 色视频一区二区三区| 奇米影视亚洲色图| 日韩欧美色综合| 亚洲成人在线免费| 97av自拍| 久久99蜜桃综合影院免费观看| 欧美极品少妇xxxxx| 欧美一区二区精品| 国产一区啦啦啦在线观看| 国产婷婷色一区二区三区在线| 神马电影网我不卡| 无码人妻一区二区三区免费| 99国产精品99久久久久久粉嫩| 久久综合99re88久久爱| 亚洲第一网站男人都懂| 久久久久99精品久久久久| 欧美激情成人在线| 超薄肉色丝袜足j调教99| 中国成人在线视频| 婷婷中文字幕综合| 亚洲女女做受ⅹxx高潮| 91国产丝袜在线播放| 亚洲综合免费观看高清在线观看| 日韩毛片在线播放| 欧美视频一区二区三区…| av网站观看| 亚洲精华国产精华| 成黄免费在线| 国产精一区二区三区| √天堂中文www官网| ass极品国模人体欣赏| 内射无码专区久久亚洲| 亚洲日韩欧美视频| 九色免费视频| 夜夜揉揉日日人人青青一国产精品| 最新中文字幕在线观看| 校园春色综合| 欧美大片免费久久精品三p| 亚洲国产精品久久久男人的天堂| 久久99精品国产自在现线小黄鸭| 丰满少妇被猛烈进入| 六月丁香色婷婷| 亚洲热在线观看| 美女无遮挡网站| 国产成人丝袜美腿| 国产精品一区高清| 国产视频手机在线播放| 中文字幕亚洲欧美一区二区三区| 另类视频欧美| 国产精品自拍合集| 中文字幕欧美激情| 色丁香婷婷综合久久| 亚洲色图国产精品| 欧美孕妇与黑人孕交| 国产69精品久久久久久久久久| 久久爱.com| 亚洲乱亚洲乱妇无码| 欧美激情一区二区三区| 久久99国产精品99久久| 久久久久久亚洲av无码专区| 亚洲天堂999| 成人在线视频免费播放| 久久久久久久久久久久久91| 97精品国产福利一区二区三区| 亚洲欧美成人影院| 一本大道久久a久久精二百| 精品入口蜜桃| 亚洲女人天堂网| 亚洲人永久免费| 好男人看片在线观看免费观看国语| 懂色av一区二区三区蜜臀| 久久久久久97三级| 男人天堂网站| 中文在线免费观看| 亚洲综合中文字幕68页| 中文字幕www| 国精产品乱码一区一区三区四区| 99久久精品免费看国产小宝寻花| 成人午夜视频免费在线观看| 青青青国内视频在线观看软件| 永久免费看片在线观看| 国产亚洲精品久久久久久牛牛| 91嫩草视频在线观看| 一区二区三区四区亚洲| 日韩欧美视频免费观看| 超碰日本道色综合久久综合| 亚洲精品天堂在线观看| 另类综合图区| 精品三区视频| zjzjzjzjzj亚洲女人| 国产伦精品一区二区三区在线观看| 免费成人在线观看av| 亚洲国产精品久久91精品| 尤物在线免费视频| 亚洲一区二区免费视频| 国产成人精品免费看在线播放| 国产在线视频一区| 九色综合婷婷综合| 国产精品久久久久秋霞鲁丝| 午夜不卡福利视频| av资源中文在线| 日韩av在线最新| 草莓视频app18在线视频| wwwav91| 日韩精品中文字幕第1页| 日韩中文字幕在线视频| 国产精品国产三级国产专播精品人| 7777精品伊人久久久大香线蕉经典版下载| 日韩中文在线视频| 同性视频网站免费男| 成人av资源网址| 草裙成人精品一区二区三区| 国产盗摄——sm在线视频| 国产美女做爰免费视频软件| 日韩专区在线观看| 久久国产精品波多野结衣| 天堂地址在线www| 日韩国产欧美一区| 久久视频在线观看| 69av视频在线播放| 成人网免费视频| 91香蕉网站| 67194成人在线观看| japan高清日本乱xxxxx| 少妇激情综合网| 青青草视频导航| 国产 欧美 日韩 在线| 欧美日韩国产免费一区二区| 国产精品久久久久久五月尺| china中国猛gary| 久久综合激情网| 久久人妻精品白浆国产| 另类图片亚洲另类| 日韩精品一区二区三区中文在线| 国产乱码精品1区2区3区| 欧美偷窥清纯综合图区| 亚洲精品在线91| 久久精品这里只有精品| 老司机成人免费视频| 国产在线精品一区二区三区不卡| 久久精彩视频| 精品亚洲一区二区三区四区五区| 欧美大学生性色视频| 欧美熟妇精品一区二区蜜桃视频| 视频直播国产精品| 电影天堂久久| 三级电影在线看| 在线 丝袜 欧美 日韩 制服| 天天av天天翘天天综合网| 日日噜噜噜噜人人爽亚洲精品| 国产黄色片在线观看| 国产精品日韩| 在线播放精品一区二区三区| 黑人巨大精品| 欧美视频第一页| 久久免费视频网| 在线播放一区二区精品视频| 国产极品嫩模在线视频一区| 午夜精品久久久久久不卡8050| 欧美色图另类图片| 欧美成人性生活| 情侣黄网站免费看| 国产精品.xx视频.xxtv| 好吊色一区二区三区| 亚洲成人一区在线观看| 一区二区视频在线观看| www.com久久久| 91tv精品福利国产在线观看| 二区三区偷拍浴室洗澡视频| 欧美xxxx免费虐| 欧美疯狂性受xxxxx另类| 欧妇女乱妇女乱视频| 懂色av一区二区三区在线播放| 国产女同无遮挡互慰高潮91| 日本黄色福利视频| 五月天激情四射| 超碰在线资源| 国产精品精品软件男同| 99在线高清视频在线播放| 国内精品久久久久久久97牛牛| 日韩精品第一页| 81精品国产乱码久久久久久| 欧洲亚洲免费在线| 亚洲视频香蕉人妖| 精品福利二区三区| 成年女人色毛片免费| 日韩视频免费直播| 免费大片在线观看www| 久久一级电影| 中文字幕第一页av| 亚洲人成在线观看一区二区| 偷窥国产亚洲免费视频| 亚洲国产日韩在线一区| 国产手机精品在线| 欧美成人伊人久久综合网| 色在线视频免费| 99re热视频在线| 午夜久久99| 欧美激情一区在线观看| 国产精品老女人| 26uuu亚洲综合色欧美| 拍拍拍在线观看视频免费| 黄视频网站在线看| 91极品尤物在线播放国产| 中文字幕亚洲一区二区三区五十路| 日韩av手机在线| 国产黄a三级三级三级| 久久久久久亚洲精品不卡4k岛国| 精品国产sm最大网站免费看| 精品福利久久久| 欧美一区二区三区艳史| 麻豆精品蜜桃| 日韩一二三在线视频播| 久久精品影视伊人网| 在线国产一区二区| 亚洲美女视频在线免费观看|