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