成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

淺談Android中AsyncTask的工作原理

瀏覽:32日期: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
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
欧美一级黄色大片| 欧美一卡在线观看| 欧美一区二区三区视频免费| 男女激情视频一区| 中文高清一区| 亚洲欧洲日韩一区二区三区| 91在线观看成人| 精品国产一区二区三区四区四 | 国产一区在线不卡| 欧美系列一区二区| 亚洲国产精品精华液网站| 99精品免费| 亚洲综合视频在线| 国产精品日韩欧美一区二区| 亚洲一区二区视频| 免费在线观看一区二区| 亚洲在线观看免费视频| 一区二区三区国产在线| 一区二区三区丝袜| 国产模特精品视频久久久久| 亚洲一区二区免费视频| 国产精品一区二区三区免费观看| 一区二区三区欧美日| 国产精品毛片| 日韩国产欧美在线观看| 色伊人久久综合中文字幕| 日本vs亚洲vs韩国一区三区二区| 色香蕉成人二区免费| 日韩在线卡一卡二| 欧美性猛片xxxx免费看久爱| 国产在线一区二区| 日韩区在线观看| 亚洲日穴在线视频| 成人午夜电影久久影院| 欧美mv和日韩mv国产网站| 成人丝袜18视频在线观看| 精品国产电影一区二区| 成人99免费视频| 国产亚洲一区二区三区| 欧美一区二区视频在线| www激情久久| 91亚洲资源网| 国产精品久线在线观看| 中文亚洲字幕| 三级在线观看一区二区| 欧美日韩在线播| 成人午夜在线免费| www亚洲一区| 激情偷拍久久| 舔着乳尖日韩一区| 在线不卡免费欧美| 欧美在线三区| 亚洲美女区一区| 91成人在线精品| 国v精品久久久网| 亚洲国产精品二十页| 亚洲精选91| 日韩黄色片在线观看| 91 com成人网| 牛牛国产精品| 亚洲自拍偷拍综合| 欧美中文字幕一区二区三区亚洲| 国产乱子伦视频一区二区三区| 精品久久国产字幕高潮| 精品成人久久| 日本sm残虐另类| 日韩精品影音先锋| 亚洲国产精品第一区二区三区| 日日夜夜一区二区| 日韩手机在线导航| 精品不卡一区| 视频一区视频二区在线观看| 欧美电影免费观看高清完整版在| 亚洲午夜极品| 美国毛片一区二区| 久久久久综合网| 免费在线国产精品| 懂色av一区二区夜夜嗨| 综合久久综合久久| 日本道免费精品一区二区三区| 国产suv精品一区二区三区| 中文字幕一区二区三区精华液 | 99精品热6080yy久久| 日本欧美在线观看| 精品久久久久久久久久久久久久久久久| 在线 亚洲欧美在线综合一区| 蜜臀av一区二区| 欧美激情艳妇裸体舞| 久久久水蜜桃av免费网站| 国产99一区视频免费| 亚洲男人都懂的| 欧美丰满高潮xxxx喷水动漫 | 欧美中文字幕不卡| 欧美在线亚洲综合一区| 日韩电影一区二区三区四区| 久久综合九色综合欧美就去吻| 国产日韩视频| 成人成人成人在线视频| 亚洲韩国一区二区三区| 欧美一区二区久久久| 亚洲每日在线| 国产裸体歌舞团一区二区| 亚洲免费视频成人| 日韩欧美三级在线| 老鸭窝毛片一区二区三区| 99国产精品一区| 麻豆精品一区二区综合av| 国产精品激情偷乱一区二区∴| 欧美日韩精品一区二区| 99pao成人国产永久免费视频| 国产成人精品亚洲777人妖| 亚洲影视资源网| 久久综合九色综合97_久久久| 久久综合给合久久狠狠色| 欧美日韩天天操| 国产乱码精品一区二区三区忘忧草 | 精品日本一线二线三线不卡| 欧美亚洲免费高清在线观看| 91视频观看免费| 久久精品国产精品亚洲精品| 国产精品女同一区二区三区| 777午夜精品免费视频| 免费欧美日韩| 一区二区视频欧美| 成人av网站在线| 捆绑变态av一区二区三区| 亚洲激情自拍视频| 欧美日韩黄色一区二区| 国产区日韩欧美| 午夜激情一区| 国产黄色精品视频| 午夜精品久久久| 国产日韩欧美麻豆| 91精品国产91热久久久做人人| 欧美中日韩免费视频| 欧美喷水视频| 自拍视频在线观看一区二区| 26uuu久久综合| 欧美精品自拍偷拍| 性欧美xxxx大乳国产app| 欧美+日本+国产+在线a∨观看| 国产精品18久久久久久久久| 日本中文字幕一区| 亚洲精品精品亚洲| 国产清纯白嫩初高生在线观看91 | 欧美—级在线免费片| 91精品国产麻豆| 欧美亚洲一区三区| 玖玖视频精品| 国产偷国产偷亚洲高清97cao| 欧美精品成人| 99久久精品99国产精品| 国产精品99久久久久久似苏梦涵 | 日本91福利区| 又紧又大又爽精品一区二区| 亚洲国产精品国自产拍av| 精品国产三级电影在线观看| 欧美日韩aaa| 欧美丝袜丝交足nylons| 久久综合狠狠综合久久综青草| 国产精品乱码| 亚洲久久视频| 在线观看日韩av电影| 午夜日本精品| 欧美精品国产一区| 欧美日韩国产一区精品一区| 欧美一区二区三区在线播放 | 成人高清视频在线| 丁香六月综合激情| 国产美女主播视频一区| 国产毛片一区二区| 国产成人亚洲综合色影视| 国产乱妇无码大片在线观看| 国产精品久久久久久久久免费丝袜 | 日本不卡1234视频| 五月综合激情婷婷六月色窝| 一个色在线综合| 亚洲欧美激情插 | 丰满白嫩尤物一区二区| 国产精品一区二区黑丝| 极品尤物av久久免费看| 国产一区二区三区av电影 | 91蜜桃传媒精品久久久一区二区| 岛国一区二区在线观看| 成人深夜在线观看| www.亚洲人| 91丨porny丨最新| 欧美成人日本| 欧美日韩一区二区三区在线视频 | av网站免费线看精品| 岛国av在线一区| 成人性生交大片免费看在线播放| bt欧美亚洲午夜电影天堂| 91在线观看污| 欧美日本中文| 亚洲网站啪啪| 99re这里只有精品6| 国产精品xnxxcom| 99日韩精品| 老牛影视一区二区三区|