久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

淺談Android中AsyncTask的工作原理

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

實(shí)際上,AsyncTask內(nèi)部是封裝了Thread和Handler。雖然AsyncTask很方便的執(zhí)行后臺(tái)任務(wù),以及在主線程上更新UI,但是,AsyncTask并不合適進(jìn)行特別耗時(shí)的后臺(tái)操作,對(duì)于特別耗時(shí)的任務(wù),個(gè)人還是建議使用線程池。好了,話不多說了,我們先看看AsyncTask的簡(jiǎn)單用法吧。

AsyncTask使用方法

AsyncTask是一個(gè)抽象的泛型類。簡(jiǎn)單的介紹一下它的使用方式代碼如下:

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','---準(zhǔn)備下載---'); } @Override protected Long doInBackground(String... params) {Log.i('AsyncTaskTest','---在后臺(tái)正在下載---');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','---下載完成,將結(jié)果返回到主線程--'); }}

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

AsyncTask的4個(gè)核心方法

1、onPreExecute():該方法在主線程中執(zhí)行,在執(zhí)行異步任務(wù)之前會(huì)被調(diào)用,一般用于一些準(zhǔn)備工作。

2、doInBackground(String... params):這個(gè)方法是在線程池中執(zhí)行,此方法用于執(zhí)行異步任務(wù)。在這個(gè)方法中可以通過publishProgress方法來更新任務(wù)的進(jìn)度,publishProgress方法會(huì)調(diào)用onProgressUpdate方法,另外,任務(wù)的結(jié)果返回給onPostExecute方法。

3、onProgressUpdate(Object... values):該方法在主線程中執(zhí)行,主要用于任務(wù)進(jìn)度更新的時(shí)候,該方法會(huì)被調(diào)用。

4、onPostExecute(Long aLong):在主線程中執(zhí)行,在異步任務(wù)執(zhí)行完畢之后,該方法會(huì)被調(diào)用,該方法的參數(shù)及為后臺(tái)的返回結(jié)果。

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

好了,AsyncTask基本的使用就介紹到這里,下面我們進(jìn)入主題,我們一起看看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方法內(nèi)部調(diào)用的是executeOnExecutor()方法。而sDefaultExecutor實(shí)際上是一個(gè)串行的線程池。而onPreExecute()方法在這里就會(huì)被調(diào)用了。接著看這個(gè)線程池。

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的執(zhí)行是排隊(duì)執(zhí)行的,因?yàn)橛嘘P(guān)鍵字synchronized,而AsyncTask的Params參數(shù)就封裝成為FutureTask類,F(xiàn)utureTask這個(gè)類是一個(gè)并發(fā)類,在這里它充當(dāng)了Runnable的作用。接著FutureTask會(huì)交給SerialExecutor的execute方法去處理,而SerialExecutor的executor方法首先就會(huì)將FutureTask添加到mTasks隊(duì)列中,如果這個(gè)時(shí)候沒有任務(wù),就會(huì)調(diào)用scheduleNext()方法,執(zhí)行下一個(gè)任務(wù)。如果有任務(wù)的話,則執(zhí)行完畢后最后在調(diào)用 scheduleNext();執(zhí)行下一個(gè)任務(wù)。直到所有任務(wù)被執(zhí)行完畢。而AsyncTask的構(gòu)造方法中有一個(gè)call()方法,而這個(gè)方法由于會(huì)被FutureTask的run方法執(zhí)行。所以最終這個(gè)call方法會(huì)在線程池中執(zhí)行。而doInBackground這個(gè)方法就是在這里被調(diào)用的。我們好好研究一下這個(gè)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);表示當(dāng)前任務(wù)已經(jīng)執(zhí)行過了。接著執(zhí)行doInBackground方法,最后將結(jié)果通過postResult(result);方法進(jìn)行傳遞。postResult()方法中通過sHandler來發(fā)送消息,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中有兩個(gè)線程池,一個(gè)是SerialExecutor,另一個(gè)是THREAD_POOL_EXECUTOR,其中前者主要是任務(wù)進(jìn)行排隊(duì)的,后者才是真正的執(zhí)行任務(wù)。

而AsyncTask中還有一個(gè)方法InternalHandler,這個(gè)方法的主要作用是將執(zhí)行環(huán)境從線程池切換到主線程的。

以上就是淺談Android中AsyncTask的工作原理的詳細(xì)內(nèi)容,更多關(guān)于Android中AsyncTask的工作原理的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 麻豆沈芯语在线观看 | 欧美精品一区二区三区在线四季 | www.9191| 久久一本| 国产精品视频一二三区 | 亚洲一区在线日韩在线深爱 | 国产超碰人人模人人爽人人添 | 欧美久久久久久久久久久久久久 | 日韩一区二区免费视频 | 亚洲综合精品视频 | 国产www在线 | 欧美在线播放 | 羞视频在线观看 | 91精品国产九九九久久久亚洲 | 九九免费观看全部免费视频 | 久久精品一| 中文字幕在线观 | 国产毛片av | 韩日一区 | 一区二区三区成人 | 久久国产婷婷国产香蕉 | 国产欧美日韩在线观看 | 天堂久久久久 | 亚洲乱码国产乱码精品精的特点 | 精品久久中文字幕 | 天堂一区二区三区 | 成年人网站国产 | 在线观看中文字幕亚洲 | 亚洲一二三 | 国产无套丰满白嫩对白 | 亚洲国产精品成人 | 一区二区三区在线免费播放 | 亚洲综合视频一区 | 99久久精品一区二区成人 | 亚洲一区二区三区在线免费观看 | 精品久久久久久久人人人人传媒 | 亚洲综合色视频在线观看 | 亚洲成人三级 | 天天操天天玩 | 国产天堂在线 | 人人爽在线观看 |