AsyncTask官方文檔教程整理
簡(jiǎn)介
Android給我們提供了一種輕量級(jí)的異步任務(wù)類AsyncTask。該類中實(shí)現(xiàn)異步操作,并提供接口反饋當(dāng)前異步執(zhí)行結(jié)果及進(jìn)度,這些接口中有直接運(yùn)行在主線程中的(如 onPostExecute,onPreExecute等)。
AsyncTask可以輕松正確的使用UI線程,這個(gè)類允許你在后臺(tái)操作,并且不需要使用threads或者h(yuǎn)andler將結(jié)果發(fā)布到UI線程。
AsyncTask設(shè)計(jì)之初就是輔助Thread和Handler的,并且不會(huì)生成線程。AsyncTask應(yīng)該被用于短時(shí)間內(nèi)的操作(最多幾秒鐘),如果你想要長(zhǎng)時(shí)間保持線程運(yùn)行,請(qǐng)使用Executor或者ThreadPoolExecutor或者FutureTask。
AsyncTask在后臺(tái)運(yùn)行任務(wù),在UI線程發(fā)布結(jié)果,定義三個(gè)參數(shù),Params, Progress和Result,執(zhí)行四個(gè)步驟,onPreExecute, doInBackground, onProgressUpdate和onPostExecute。
使用方法
AsyncTask必須被繼承來使用。子類必須實(shí)現(xiàn)至少一個(gè)方法(ddoInBackground(Params…))
,還有一個(gè)最常用的方法(onPostExecute(Result)
。
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { protected Long doInBackground(URL... urls) { int count = urls.length; long totalSize = 0; for (int i = 0; i < count; i++) { totalSize += Downloader.downloadFile(urls[i]); publishProgress((int) ((i / (float) count) * 100)); // Escape early if cancel() is called if (isCancelled()) break; } return totalSize; } protected void onProgressUpdate(Integer... progress) { setProgressPercent(progress[0]); } protected void onPostExecute(Long result) { showDialog("Downloaded " + result + " bytes"); } }
啟動(dòng)異步任務(wù):
new DownloadFilesTask().execute(url1, url2, url3);
AsyncTasks的范型參數(shù)
異步任務(wù)使用的參數(shù)是:
- Params, 啟動(dòng)任務(wù)時(shí)傳入的參數(shù)
- Progress, 在后臺(tái)任務(wù)執(zhí)行時(shí)發(fā)布到UI線程的進(jìn)度類型
- Result, 后臺(tái)任務(wù)執(zhí)行完成的結(jié)果
這三個(gè)參數(shù)不一定非要指定,可以使用Void來傳入空值。
private class MyTask extends AsyncTask<Void, Void, Void> { ... }
4個(gè)步驟
onPreExecute()
,在應(yīng)用程序執(zhí)行前在UI線程上調(diào)用。這步通常被用來準(zhǔn)備任務(wù)開始,例如顯示一個(gè)進(jìn)度條。doInBackground(Params…)
,在onPreExecute()
方法被調(diào)用后立即執(zhí)行此方法,用來執(zhí)行長(zhǎng)時(shí)間的任務(wù)。- 參數(shù)會(huì)在這一步傳入,最后的結(jié)果必須返回。在這步頁(yè)可以使用
publishProgress(Progress...)
來發(fā)布進(jìn)度,這些值時(shí)在UI線程中發(fā)布的,在onProgressUpdate(Progress...)
接收。onProgressUpdate(Progress…)
, 在publishProgress(Progress...)
方法調(diào)用后在UI線程調(diào)用此方法。執(zhí)行時(shí)間未定義。該方法用于在后臺(tái)計(jì)算仍在執(zhí)行時(shí),用戶界面中顯示的進(jìn)度。例如,它可以用于對(duì)進(jìn)度條進(jìn)行動(dòng)畫處理或在文本字段中顯示日志。 onPostExecute(Result)
,在后臺(tái)計(jì)算完成后在UI線程上調(diào)用。 后臺(tái)計(jì)算的結(jié)果作為參數(shù)傳遞給該步驟。
取消異步任務(wù)
任何時(shí)候都可以通過調(diào)用cancel(boolean)
方法來取消任務(wù)。
調(diào)用此方法將導(dǎo)致對(duì)isCancelled()
的后續(xù)調(diào)用返回true。
調(diào)用此方法后,onCancelled(Object)
,而不調(diào)用onPostExecute(Object)
為了盡可能快地取消任務(wù),應(yīng)該始終從doInBackground(Object [])
中定期檢查isCancelled()
的返回值(如果可能的話)。
線程規(guī)則
- 必須在UI線程上加載AsyncTask類。
- 必須在UI線程上創(chuàng)建任務(wù)實(shí)例。
- 必須在UI線程上調(diào)用
execute(Params …)
- 不要手動(dòng)調(diào)用
onPreExecute()
,onPostExecute(Result)
,doInBackground(Params …)
,onProgressUpdate(Progress …)
。 - 該任務(wù)只能執(zhí)行一次(如果嘗試第二次執(zhí)行,將拋出異常)。
內(nèi)存監(jiān)控
AsyncTask保證所有回調(diào)調(diào)用都是同步的,使得以下操作在沒有顯式同步的情況下是安全的。
- 在構(gòu)造函數(shù)或
onPreExecute()
中設(shè)置成員字段,并在doInBackground(Params …)
中引用它們。 - 在
doInBackground(Params …)
中設(shè)置成員字段,并在onProgressUpdate(Progress …)
和onPostExecute(Result)
中引用它們。
執(zhí)行順序
首次引入時(shí),AsyncTasks在單個(gè)后臺(tái)線程上串行執(zhí)行。
從DONUT開始,這被更改為一個(gè)允許多個(gè)任務(wù)并行操作的線程池。
從HONEYCOMB開始,任務(wù)在單個(gè)線程上執(zhí)行,以避免并行執(zhí)行引起的常見應(yīng)用程序錯(cuò)誤。
如果真的需要并行執(zhí)行,則可以使用THREAD_POOL_EXECUTOR調(diào)用executeOnExecutor(java.util.concurrent.Executor,Object [])
。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
android導(dǎo)入第三方j(luò)ar包報(bào)錯(cuò) 如何正確導(dǎo)入jar包
怎樣在android平臺(tái)上使用第三方j(luò)ar包,為什么我在引入了,編譯時(shí)沒有錯(cuò)誤,運(yùn)行時(shí)就有錯(cuò)誤,報(bào)無法實(shí)例化錯(cuò)誤,請(qǐng)問這是什么原因,本文給于解決方法,需要了解的朋友可以參考下2012-12-12使用Fragment來處理Andoird app的UI布局的實(shí)例分享
這篇文章主要介紹了使用Fragment來處理Andoird appUI布局的實(shí)例分享,Fragment的出現(xiàn)緩解了代碼依賴于Activity而造成的臃腫狀況,需要的朋友可以參考下2016-02-02android使用ViewPager實(shí)現(xiàn)圖片自動(dòng)切換
這篇文章主要為大家詳細(xì)介紹了android使用ViewPager實(shí)現(xiàn)圖片自動(dòng)切換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02Android中分析Jetpack?Compose動(dòng)畫內(nèi)部的實(shí)現(xiàn)原理
這篇文章主要介紹了Android中分析Jetpack?Compose動(dòng)畫內(nèi)部的實(shí)現(xiàn)原理,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-09-09Android應(yīng)用實(shí)現(xiàn)安裝后自啟動(dòng)的方法
今天小編就為大家分享一篇Android應(yīng)用實(shí)現(xiàn)安裝后自啟動(dòng)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-08-08Android基于google Zxing實(shí)現(xiàn)各類二維碼掃描效果
這篇文章主要介紹了Android基于google Zxing實(shí)現(xiàn)各類二維碼掃描效果的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-02-02Android利用繪制緩沖實(shí)現(xiàn)代碼雨效果
看過很多代碼雨的前端實(shí)現(xiàn),卻很少看到過Android代碼雨效果的實(shí)現(xiàn),當(dāng)然 open gl es的實(shí)現(xiàn)是有的,一個(gè)主要的原因是,在Android Canvas繪制時(shí),很少有人考慮使用繪制緩沖,所以本文將給大家介紹Android如何利用繪制緩沖實(shí)現(xiàn)代碼雨效果,需要的朋友可以參考下2024-03-03