国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

AsyncTask官方文檔教程整理

2019-10-23 18:32:39
字體:
供稿:網(wǎng)友

簡介

Android給我們提供了一種輕量級的異步任務類AsyncTask。該類中實現(xiàn)異步操作,并提供接口反饋當前異步執(zhí)行結果及進度,這些接口中有直接運行在主線程中的(如 onPostExecute,onPreExecute等)。

AsyncTask可以輕松正確的使用UI線程,這個類允許你在后臺操作,并且不需要使用threads或者handler將結果發(fā)布到UI線程。

AsyncTask設計之初就是輔助Thread和Handler的,并且不會生成線程。AsyncTask應該被用于短時間內(nèi)的操作(最多幾秒鐘),如果你想要長時間保持線程運行,請使用Executor或者ThreadPoolExecutor或者FutureTask。

AsyncTask在后臺運行任務,在UI線程發(fā)布結果,定義三個參數(shù),Params, Progress和Result,執(zhí)行四個步驟,onPreExecute, doInBackground, onProgressUpdate和onPostExecute。

使用方法

AsyncTask必須被繼承來使用。子類必須實現(xiàn)至少一個方法(ddoInBackground(Params…)) ,還有一個最常用的方法(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"); }}

啟動異步任務:

new DownloadFilesTask().execute(url1, url2, url3);

AsyncTasks的范型參數(shù)

異步任務使用的參數(shù)是:

  • Params, 啟動任務時傳入的參數(shù)
  • Progress, 在后臺任務執(zhí)行時發(fā)布到UI線程的進度類型
  • Result, 后臺任務執(zhí)行完成的結果

這三個參數(shù)不一定非要指定,可以使用Void來傳入空值。

private class MyTask extends AsyncTask<Void, Void, Void> { ... }

4個步驟

  • onPreExecute() ,在應用程序執(zhí)行前在UI線程上調(diào)用。這步通常被用來準備任務開始,例如顯示一個進度條。
  • doInBackground(Params…) ,在onPreExecute()方法被調(diào)用后立即執(zhí)行此方法,用來執(zhí)行長時間的任務。
  • 參數(shù)會在這一步傳入,最后的結果必須返回。在這步頁可以使用publishProgress(Progress...)來發(fā)布進度,這些值時在UI線程中發(fā)布的,在onProgressUpdate(Progress...)接收。onProgressUpdate(Progress…) , 在publishProgress(Progress...)方法調(diào)用后在UI線程調(diào)用此方法。執(zhí)行時間未定義。該方法用于在后臺計算仍在執(zhí)行時,用戶界面中顯示的進度。例如,它可以用于對進度條進行動畫處理或在文本字段中顯示日志。
  • onPostExecute(Result) ,在后臺計算完成后在UI線程上調(diào)用。 后臺計算的結果作為參數(shù)傳遞給該步驟。

取消異步任務

任何時候都可以通過調(diào)用cancel(boolean)方法來取消任務。

調(diào)用此方法將導致對isCancelled()的后續(xù)調(diào)用返回true。

調(diào)用此方法后,onCancelled(Object) ,而不調(diào)用onPostExecute(Object)

為了盡可能快地取消任務,應該始終從doInBackground(Object [])中定期檢查isCancelled()的返回值(如果可能的話)。

線程規(guī)則

  • 必須在UI線程上加載AsyncTask類。
  • 必須在UI線程上創(chuàng)建任務實例。
  • 必須在UI線程上調(diào)用execute(Params …)
  • 不要手動調(diào)用onPreExecute()onPostExecute(Result)doInBackground(Params …)onProgressUpdate(Progress …)
  • 該任務只能執(zhí)行一次(如果嘗試第二次執(zhí)行,將拋出異常)。

內(nèi)存監(jiān)控

AsyncTask保證所有回調(diào)調(diào)用都是同步的,使得以下操作在沒有顯式同步的情況下是安全的。

  • 在構造函數(shù)或onPreExecute()中設置成員字段,并在doInBackground(Params …)中引用它們。
  • doInBackground(Params …)中設置成員字段,并在onProgressUpdate(Progress …)onPostExecute(Result)中引用它們。

執(zhí)行順序

首次引入時,AsyncTasks在單個后臺線程上串行執(zhí)行。

從DONUT開始,這被更改為一個允許多個任務并行操作的線程池。

從HONEYCOMB開始,任務在單個線程上執(zhí)行,以避免并行執(zhí)行引起的常見應用程序錯誤。

如果真的需要并行執(zhí)行,則可以使用THREAD_POOL_EXECUTOR調(diào)用executeOnExecutor(java.util.concurrent.Executor,Object [])

總結

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網(wǎng)的支持。


注:相關教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 松溪县| 银川市| 永登县| 三亚市| 南郑县| 乌拉特中旗| 甘德县| 凤凰县| 张家港市| 文昌市| 宿迁市| 古交市| 监利县| 鄢陵县| 新竹县| 德昌县| 青铜峡市| 突泉县| 从化市| 洮南市| 阳朔县| 黎城县| 乌兰浩特市| 海兴县| 吉木乃县| 陆川县| 平潭县| 司法| 石渠县| 池州市| 教育| 卫辉市| 元朗区| 柳州市| 句容市| 屏东县| 固始县| 无为县| 昭通市| 伊川县| 邯郸市|