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