For investors
股價:
5.36 美元 %For investors
股價:
5.36 美元 %認(rèn)真做教育 專心促就業(yè)
平時我們在開發(fā)Android程序時遇到較耗時任務(wù)的處理,如I/O訪問的數(shù)據(jù)庫操作、網(wǎng)絡(luò)訪問等情況時造成UI假死等問題,通過 AsyncTask可以很好的解決這個問題,就今天以在Android中執(zhí)行Downloader.downloadFile(url),可能會堵塞整個 界面。顯然這會影響用戶體驗,我們?nèi)绾谓鉀Q這個問題呢?
方法一、
創(chuàng)建一個新的線程執(zhí)行我們的任務(wù),使用Thread類,在 run(){}中寫入任務(wù)代碼,比如:
new Thread(new Runnable() {
public void run() {
Downloader.downloadFile(url);
}
}).start();
但使用Thread會產(chǎn)生一些意想不到的問題,需要程序員用更多的代碼手動的維護它。
方法二: Android SDK為我們提供了一個后臺任務(wù)的處理工具AsyncTask。AsyncTask就是一個封裝過的后臺任務(wù)類顧名思義就是異步任務(wù),方便我們維 護,Android開發(fā)網(wǎng)提示這樣的好處可以解決一些線程安全問題,AsyncTask直接繼承于Object類,位置為 android.os.AsyncTask。要使用AsyncTask工作我們要提供三個泛型參數(shù),并重載四個方法(至少重載一個)。
三個泛型:
Param ,任務(wù)執(zhí)行器需要的數(shù)據(jù)類型
Progress 后臺計算中使用的進度單位數(shù)據(jù)類型
Result 后臺計算返回結(jié)果的數(shù)據(jù)類型
有些參數(shù)是可以設(shè)置為不使用的,只要傳遞為Void型即可,比如AsyncTask
四個步驟:
onPreExecute(),執(zhí)行預(yù)處理,它運行于UI線程,可以為后臺任務(wù)做一些準(zhǔn)備工作,比如繪制一個進度條控件。
doInBackground(Params...), 后臺進程執(zhí)行的具體計算在這里實現(xiàn),doInBackground(Params...)是AsyncTask的關(guān)鍵,此方法必須重載。在這個方法內(nèi)可以 使用publishProgress(Progress...)改變當(dāng)前的進度值。
onProgressUpdate(Progress...), 運行于UI線程。如果在doInBackground(Params...)中使用了publishProgress(Progress...),就會觸 發(fā)這個方法。在這里可以對進度條控件根據(jù)進度值做出具體的響應(yīng)。
onPostExecute(Result),運行于UI線程,可以對后臺任務(wù)的 結(jié)果做出處理,結(jié)果就是doInBackground(Params...)的返回值。此方法也要經(jīng)常重載,如果Result為null表明后臺任務(wù)沒有 完成(被取消或者出現(xiàn)異常)。
【免責(zé)聲明】本文部分系轉(zhuǎn)載,轉(zhuǎn)載目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點和對其真實性負(fù)責(zé)。如涉及作品內(nèi)容、版權(quán)和其它問題,請在30日內(nèi)與聯(lián)系我們,我們會予以更改或刪除相關(guān)文章,以保證您的權(quán)益!