电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

淺談Android中AsyncTask的工作原理

瀏覽:104日期:2022-09-18 11:09:32
目錄概述AsyncTask使用方法AsyncTask的4個核心方法AsyncTask的工作原理概述

實際上,AsyncTask內部是封裝了Thread和Handler。雖然AsyncTask很方便的執行后臺任務,以及在主線程上更新UI,但是,AsyncTask并不合適進行特別耗時的后臺操作,對于特別耗時的任務,個人還是建議使用線程池。好了,話不多說了,我們先看看AsyncTask的簡單用法吧。

AsyncTask使用方法

AsyncTask是一個抽象的泛型類。簡單的介紹一下它的使用方式代碼如下:

package com.example.huangjialin.myapplication;import android.os.AsyncTask;import android.util.Log;public class AsyncTaskTest extends AsyncTask<String, Object, Long>{ @Override protected void onPreExecute() {super.onPreExecute();Log.i('AsyncTaskTest','---準備下載---'); } @Override protected Long doInBackground(String... params) {Log.i('AsyncTaskTest','---在后臺正在下載---');return null; } @Override protected void onProgressUpdate(Object... values) {super.onProgressUpdate(values);Log.i('AsyncTaskTest','---在更新---'); } @Override protected void onPostExecute(Long aLong) {super.onPostExecute(aLong);Log.i('AsyncTaskTest','---下載完成,將結果返回到主線程--'); }}

然后在activity中調用 new AsyncTaskTest().execute();就可以了...使用起來比較簡單,這里就不在講述怎么使用了。

AsyncTask的4個核心方法

1、onPreExecute():該方法在主線程中執行,在執行異步任務之前會被調用,一般用于一些準備工作。

2、doInBackground(String... params):這個方法是在線程池中執行,此方法用于執行異步任務。在這個方法中可以通過publishProgress方法來更新任務的進度,publishProgress方法會調用onProgressUpdate方法,另外,任務的結果返回給onPostExecute方法。

3、onProgressUpdate(Object... values):該方法在主線程中執行,主要用于任務進度更新的時候,該方法會被調用。

4、onPostExecute(Long aLong):在主線程中執行,在異步任務執行完畢之后,該方法會被調用,該方法的參數及為后臺的返回結果。

除了這幾個方法之外還有一些不太常用的方法,如onCancelled(),在異步任務取消的情況下,該方法會被調用。

好了,AsyncTask基本的使用就介紹到這里,下面我們進入主題,我們一起看看AsyncTask的工作原理。

AsyncTask的工作原理

先從execute走起,源碼來了

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

為了方面分析,我就把英文注釋干掉了…源碼可以知道從上面的execute方法內部調用的是executeOnExecutor()方法。而sDefaultExecutor實際上是一個串行的線程池。而onPreExecute()方法在這里就會被調用了。接著看這個線程池。

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); }} }public AsyncTask() {mWorker = new WorkerRunnable<Params, Result>() { public Result call() throws Exception {mTaskInvoked.set(true);Result result = null;try { Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); //noinspection unchecked result = doInBackground(mParams); Binder.flushPendingCommands();} catch (Throwable tr) { mCancelled.set(true); throw tr;} finally { postResult(result);}return result; }};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 occurred while executing doInBackground()', e.getCause());} catch (CancellationException e) { postResultIfNotInvoked(null);} }}; }

從上面的代碼可以知道,AsyncTask的執行是排隊執行的,因為有關鍵字synchronized,而AsyncTask的Params參數就封裝成為FutureTask類,FutureTask這個類是一個并發類,在這里它充當了Runnable的作用。接著FutureTask會交給SerialExecutor的execute方法去處理,而SerialExecutor的executor方法首先就會將FutureTask添加到mTasks隊列中,如果這個時候沒有任務,就會調用scheduleNext()方法,執行下一個任務。如果有任務的話,則執行完畢后最后在調用 scheduleNext();執行下一個任務。直到所有任務被執行完畢。而AsyncTask的構造方法中有一個call()方法,而這個方法由于會被FutureTask的run方法執行。所以最終這個call方法會在線程池中執行。而doInBackground這個方法就是在這里被調用的。我們好好研究一下這個call()方法。

public Result call() throws Exception {mTaskInvoked.set(true);Result result = null;try { Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); //noinspection unchecked result = doInBackground(mParams); Binder.flushPendingCommands();} catch (Throwable tr) { mCancelled.set(true); throw tr;} finally { postResult(result);}return result; }};private Result postResult(Result result) {@SuppressWarnings('unchecked')Message message = getHandler().obtainMessage(MESSAGE_POST_RESULT,new AsyncTaskResult<Result>(this, result));message.sendToTarget();return result; }

mTaskInvoked.set(true);表示當前任務已經執行過了。接著執行doInBackground方法,最后將結果通過postResult(result);方法進行傳遞。postResult()方法中通過sHandler來發送消息,sHandler的代碼如下:

private static class InternalHandler extends Handler {public InternalHandler() { super(Looper.getMainLooper());}@SuppressWarnings({'unchecked', 'RawUseOfParameterizedType'})@Overridepublic 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; }} }private void finish(Result result) {if (isCancelled()) { onCancelled(result);} else { onPostExecute(result);}mStatus = Status.FINISHED; }

注意:AsyncTask中有兩個線程池,一個是SerialExecutor,另一個是THREAD_POOL_EXECUTOR,其中前者主要是任務進行排隊的,后者才是真正的執行任務。

而AsyncTask中還有一個方法InternalHandler,這個方法的主要作用是將執行環境從線程池切換到主線程的。

以上就是淺談Android中AsyncTask的工作原理的詳細內容,更多關于Android中AsyncTask的工作原理的資料請關注好吧啦網其它相關文章!

標簽: Android
相關文章:
主站蜘蛛池模板: 深圳南财多媒体有限公司介绍| 厂房出租-厂房规划-食品技术-厂房设计-厂房装修-建筑施工-设备供应-设备求购-龙爪豆食品行业平台 | 广州冷却塔维修厂家_冷却塔修理_凉水塔风机电机填料抢修-广东康明节能空调有限公司 | 大功率金属激光焊接机价格_不锈钢汽车配件|光纤自动激光焊接机设备-东莞市正信激光科技有限公司 定制奶茶纸杯_定制豆浆杯_广东纸杯厂_[绿保佳]一家专业生产纸杯碗的厂家 | 塑料脸盆批发,塑料盆生产厂家,临沂塑料广告盆,临沂家用塑料盆-临沂市永顺塑业 | 缓蚀除垢剂_循环水阻垢剂_反渗透锅炉阻垢剂_有机硫化物-郑州威大水处理材料有限公司 | 海外整合营销-独立站营销-社交媒体运营_广州甲壳虫跨境网络服务 焊管生产线_焊管机组_轧辊模具_焊管设备_焊管设备厂家_石家庄翔昱机械 | 温控器生产厂家-提供温度开关/热保护器定制与批发-惠州市华恺威电子科技有限公司 | 带式压滤机_污泥压滤机_污泥脱水机_带式过滤机_带式压滤机厂家-河南恒磊环保设备有限公司 | 济南展厅设计施工_数字化展厅策划设计施工公司_山东锐尚文化传播有限公司 | 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 深圳品牌设计公司-LOGO设计公司-VI设计公司-未壳创意 | 烘箱-工业烘箱-工业电炉-实验室干燥箱 - 苏州华洁烘箱制造有限公司 | 日本东丽膜_反渗透膜_RO膜价格_超滤膜_纳滤膜-北京东丽阳光官网 日本细胞免疫疗法_肿瘤免疫治疗_NK细胞疗法 - 免疫密码 | 山东聚盛新型材料有限公司-纳米防腐隔热彩铝板和纳米防腐隔热板以及钛锡板、PVDF氟膜板供应商 | 成都装修公司-成都装修设计公司推荐-成都朗煜装饰公司 | 碳纤维复合材料制品生产定制工厂订制厂家-凯夫拉凯芙拉碳纤维手机壳套-碳纤维雪茄盒外壳套-深圳市润大世纪新材料科技有限公司 | 室内室外厚型|超薄型|非膨胀型钢结构防火涂料_隧道专用防火涂料厂家|电话|价格|批发|施工 | 佛山市钱丰金属不锈钢蜂窝板定制厂家|不锈钢装饰线条|不锈钢屏风| 电梯装饰板|不锈钢蜂窝板不锈钢工艺板材厂家佛山市钱丰金属制品有限公司 | 学叉车培训|叉车证报名|叉车查询|叉车证怎么考-工程机械培训网 | 烟雾净化器-滤筒除尘器-防爆除尘器-除尘器厂家-东莞执信环保科技有限公司 | 安全光栅|射频导纳物位开关|音叉料位计|雷达液位计|两级跑偏开关|双向拉绳开关-山东卓信机械有限公司 | 紫外荧光硫分析仪-硫含量分析仪-红外光度测定仪-泰州美旭仪器 | 深圳彩钢板_彩钢瓦_岩棉板_夹芯板_防火复合彩钢板_长鑫 | 高低温试验箱-模拟高低温试验箱订制-北京普桑达仪器科技有限公司【官网】 | 云南成人高考网| 搪玻璃冷凝器_厂家-越宏化工设备 | 上海租奔驰_上海租商务车_上海租车网-矢昂汽车服务公司 | 乙炔气体报警装置|固定式氯化氢检测仪|河南驰诚电气百科 | 上海网站建设-上海网站制作-上海网站设计-上海做网站公司-咏熠软件 | 安平县鑫川金属丝网制品有限公司,声屏障,高速声屏障,百叶孔声屏障,大弧形声屏障,凹凸穿孔声屏障,铁路声屏障,顶部弧形声屏障,玻璃钢吸音板 | 厂房出租_厂房出售_产业园区招商_工业地产&nbsp;-&nbsp;中工招商网 | 【365公司转让网】公司求购|转让|资质买卖_股权转让交易平台 | 辐射色度计-字符亮度测试-反射式膜厚仪-苏州瑞格谱光电科技有限公司 | 视频直播 -摄影摄像-视频拍摄-直播分发 | 洁净棚-洁净工作棚-无菌室-净化工程公司_北京卫护科技有限公司 | 聚丙烯酰胺_厂家_价格-河南唐达净水材料有限公司 | 北京翻译公司_同传翻译_字幕翻译_合同翻译_英语陪同翻译_影视翻译_翻译盖章-译铭信息 | 定坤静电科技静电消除器厂家-除静电设备 | 电镀标牌_电铸标牌_金属标贴_不锈钢标牌厂家_深圳市宝利丰精密科技有限公司 | 冻干机(冷冻干燥机)_小型|实验型|食品真空冷冻干燥机-松源 |