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

首頁 > 學院 > 開發設計 > 正文

AsyncTask異步任務加載網絡數據

2019-11-08 00:20:21
字體:
來源:轉載
供稿:網友

異步任務加載網絡數據

在Android中提供了一個異步任務的類AsyncTask,簡單來說,這個類中的任務是運行在后臺線程中的, 并可以將結果放到UI線程中進行處理,它定義了三種泛型,分別是Params、PRogress和Result,分別表示請求的參數、任務的進度和獲得結果的數據。 1. 使用原因: * 是其中使用了線程池技術,而且其中的方法很容易實現調用 * 可以調用相關的方法,在開啟子線程前和后,進行界面的更新 * 一旦任務多了,不用每次new新的線程,可以直接調用 2. 執行的順序: onPreExecute()[執行前開啟]—>doInBackground()—>onProgressUpDate()—>onPostExecute() 3. 執行過程: 當一個異步任務開啟后,執行過程如下: * onPreExecute(): 這個方法是執行在主線程中的,這步操作是用于準備好任務的,作為任務加載的準備工作。建議在這個方法中做好初始化工作,彈出一個對話框。 * doInBackground(): 這個方法是執行在子線程中的,當onPreExecute()執行完后,會立即開啟這個方法,在方法中可以執行耗時的操作,需要將請求參數傳遞進來,發給服務器,并將獲取到的數據返回,數據會傳給最后一步中:這些值都是將被放到主線程種,也可以不斷的傳給下一步的onProgressUpdate()中進行更新,可以通過不斷調用publishProgress(),將數據(或進度)不斷傳遞給onProgressUpdate()方法,進行不斷更新界面 * onProgressUpdate(): 這個方法是執行在主線程中的,publishProgress()在被調用后才開啟的這個方法,它在何時被開啟是不確定的,執行這個方法的過程中,doInBackground()是仍在執行的,即子線程還在運行著 * onPostExecute(): 這個方法是執行在主線程中的,當后臺的子線程執行完畢后才調用此方法。doInBackground()返回的結果會作為參數被傳遞過來,可以在這個方法中進行更新界面的操作 * execute(): 最后創建AsyncTask自定義的類,開啟異步任務 4. 實現原理: 1. 線程池的創建: 在創建了AsyncTask的時候,會默認創建一個線程池ThreadPoolExecutor,并默認創建出5個線程放入到線程池中,最多可放128個線程,且這個線程池是公共的唯一一份。 2. 任務的執行: 在exexute中,會執行run方法,當執行完run方法后,會調用scheduleNext()不斷的從雙端隊列中輪詢,獲取下一個任務并繼續放到一個子線程中執行,知道異步任務執行完畢 3. 消息的處理: 在執行完onPreExecute()方法之后,執行了doInBackground()方法,然后就不斷的發送請求獲取數據,在這個AsycTask中維護了一個InternalHandler的類,這個類是繼承Handler的,獲取的數據是通過handler進行處理和發送的。在其handlerMessage方法中,將消息傳遞給onProgressUpdate()進行進度的更新,也就可以將結果發送到主線程中,進行界面的更新了 5. 需要注意的是: * 這個AsyncTask類必須由子類調用 * 雖然是放在子線程中執行的操作,但是不建議做特別耗時的操作,如果操作過于耗時,建議使用線程池TreadPoolExecutor和FutureTask

示例代碼:

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.downloadFiles(url[i]); publishProgress(int)((i/(foaltcount)*100)); if(isCancelled()) break; } return totalSize; }protected void onProgressUpdate(integer...progress){ setProgressPercent(progress[0]); }protected void onPostExecute(Long result){ showDialog("Downloaded" + result + "bytes"); }}new DownLoadFielsTask().execute(url1,url2,url3);
上一篇:瞎搞知識(view屬性1)

下一篇:runtime 理解

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 襄樊市| 息烽县| 湟源县| 嘉禾县| 灌阳县| 东丽区| 宝应县| 华池县| 忻州市| 建阳市| 丹阳市| 江华| 高平市| 保定市| 山阴县| 乐山市| 洛阳市| 湘西| 涟源市| 库伦旗| 遂川县| 区。| 辉南县| 神农架林区| 凤城市| 崇州市| 漾濞| 神池县| 永寿县| 井陉县| 凭祥市| 仪陇县| 中江县| 石景山区| 博野县| 静宁县| 卢氏县| 永丰县| 平南县| 灵川县| 哈尔滨市|