標籤:
參考網址:http://www.cnblogs.com/devinzhang/archive/2012/02/13/2350070.html
1 /* 2 * Params 啟動任務執行的輸入參數,比如HTTP請求的URL。 3 * Progress 背景工作執行的百分比。 4 * Result 後台執行任務最終返回的結果,比如String 5 * 6 * doInBackground(Params…) :後台執行,比較耗時的操作都可以放在這裡。注意這裡不能直接操作UI。 7 * 此方法在後台線程執行,完成任務的主要工作,通常需要較長的時間。 8 * 在執行過程中可以調用publicProgress(Progress…)來更新任務的進度。 9 * onPostExecute(Result) :相當於Handler 處理UI的方式,在這裡面可以使用在doInBackground 得到的結果處理操作UI。 10 * 此方法在主線程執行,任務執行的結果作為此方法的參數返回11 * 12 * 有必要的話你還得重寫以下這三個方法,但不是必須的:13 * onProgressUpdate(Progress…) 可以使用進度條增加使用者體驗度。 此方法在主線程執行,用於顯示任務執行的進度。14 * onPreExecute() 這裡是終端使用者調用Excute時的介面,當任務執行之前開始調用此方法,可以在這裡顯示進度對話方塊。15 * onCancelled() 使用者調用取消時,要做的操作16 */17 public class MyAsyncTask extends AsyncTask<String, Integer, List<Product>>18 {19 @Override20 protected void onPreExecute()21 {22 Toast.makeText(getApplicationContext(), "開始載入", Toast.LENGTH_SHORT).show();23 super.onPreExecute();24 }25 26 // * 後台運行耗時操作,不能直接操作主UI線程裡面的資料,通過函數publishProgress和onProgressUpdate間接操作主UI線程裡面的資料27 @Override28 protected List<Product> doInBackground(String... params)29 {30 // 擷取產品列表,不能操作主UI線程內的資料31 List<Product> temProducts = new GetProductService().getProduct(page);32 // for( Integer i = 0; i < 3; ++i )33 // {34 // publishProgress(i); // 通過調用該函數通知 onProgressUpdate並且在onProgressUpdate中可以修改UI主線程中的參數35 // }36 return temProducts;37 }38 39 // * 子線程中調用publishProgress函數通知此函數操作主UI線程中的資料(主要是進度條資料)40 @Override41 protected void onProgressUpdate(Integer... values)42 {43 int vlaue = values[0]; // 擷取主線程中調用 publisProgress 傳遞過來的進度值44 Toast.makeText(getApplicationContext(), "載入進度:" + vlaue, Toast.LENGTH_LONG).show();45 super.onProgressUpdate(values);46 }47 48 // 相當於Handler 處理UI的方式,在這裡面可以使用在doInBackground 得到的結果處理操作UI。此方法在主線程執行,任務執行的結果作為此方法的參數返回49 // 這裡的product參數對應AsyncTask中的第三個參數(也就是接收doInBackground的傳回值) 50 // 在doInBackground方法執行結束之後在運行,並且運行在UI線程當中 可以對UI空間進行設定 51 @Override52 protected void onPostExecute(List<Product> product)53 {54 Toast.makeText(getApplicationContext(), "載入完畢", Toast.LENGTH_LONG).show();55 ListUtil.products = products; // 擷取產品列表對象56 isLoading = false; // 設定載入標誌狀態位:載入完畢57 58 adapter.setProducts(product);59 adapter.notifyDataSetChanged();60 if( product.size() == 0 )61 {62 Toast.makeText(getApplicationContext(), "已經載入完畢", Toast.LENGTH_LONG).show();63 productListView.removeFooterView(footView);64 isLoading = true;65 }66 }67 68 @Override69 protected void onCancelled(List<Product> result)70 {71 super.onCancelled(result);72 }73 }
2015.01.15(android AsyncTask)