在實(shí)際應(yīng)用中經(jīng)常會(huì)遇到比較耗時(shí)任務(wù)的處理,比如網(wǎng)絡(luò)連接歉摧,數(shù)據(jù)庫(kù)操作等情況時(shí)艇肴,如果這些操作都是放在主線程(UI線程)中,則會(huì)造成UI的假死現(xiàn)象叁温,Android中可以使用AsyncTask和Handler兩種異步方式來解決這種問題再悼。今天我們來講AsyncTask異步方式的的使用,Handler我會(huì)在以后的的文章介紹.
AsyncTask(異步任務(wù)處理)
在使用AsyncTask時(shí)處理類需要繼承AsyncTask,提供三個(gè)泛型參數(shù)膝但,并且重載AsyncTask的四個(gè)方法(至少重載一個(gè))冲九。
三個(gè)泛型參數(shù):
1.Param任務(wù)執(zhí)行器需要的數(shù)據(jù)類型
2.Progress后臺(tái)計(jì)算中使用的進(jìn)度單位數(shù)據(jù)類型
3.Result后臺(tái)計(jì)算返回結(jié)果的數(shù)據(jù)類型
在設(shè)置參數(shù)時(shí)通常是這樣的:String...
params,這表示方法可以有0個(gè)或多個(gè)此類型參數(shù)跟束;有時(shí)參數(shù)可以設(shè)置為不使用莺奸,用Void...即可。
四個(gè)方法:
1.onPreExecute()執(zhí)行預(yù)處理冀宴,它運(yùn)行于UI線程灭贷,可以為后臺(tái)任務(wù)做一些準(zhǔn)備工作,比如繪制一個(gè)進(jìn)度條控件略贮。
2.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)度值览妖。
3.onProgressUpdate(Progress...)運(yùn)行于UI線程。如果在doInBackground(Params...)中使用了publishProgress(Progress...)揽祥,就會(huì)觸發(fā)這個(gè)方法黄痪。在這里可以對(duì)進(jìn)度條控件根據(jù)進(jìn)度值做出具體的響應(yīng)。
4.onPostExecute(Result)運(yùn)行于UI線程盔然,可以對(duì)后臺(tái)任務(wù)的結(jié)果做出處理桅打,結(jié)果就是doInBackground(Params...)的返回值是嗜。此方法也要經(jīng)常重載,如果Result為null表明后臺(tái)任務(wù)沒有完成(被取消或者出現(xiàn)異常)挺尾。
上代碼:
```
1.// AsyncTask異步方式下載圖片
2.classDownImageTaskextendsAsyncTask?{
3.//執(zhí)行預(yù)處理
4.@Override
5.protectedvoidonPreExecute()?{
6.super.onPreExecute();
7.//顯示進(jìn)度條
8.progressBar.setVisibility(View.VISIBLE);
9.progressBar.setMax(100);
10.}
11.//后臺(tái)進(jìn)程的執(zhí)行
12.@Override
13.protectedBitmap?doInBackground(String...?params)?{
14.try{
15.URL?url?=newURL(params[0]);
16.HttpURLConnection?conn?=?(HttpURLConnection)?url
17..openConnection();
18.InputStream?inputStream?=?conn.getInputStream();
19.bitmap?=?BitmapFactory.decodeStream(inputStream);
20.//進(jìn)度條的更新鹅搪,我這邊只是用一個(gè)循環(huán)來示范,在實(shí)際應(yīng)用中要使用已下載文件的大小和文件總大小的比例來更新
21.for(inti?=1;?i?<=10;?i++)?{
22.publishProgress(i?*10);
23.Thread.sleep(200);
24.}
25.inputStream.close();
26.}catch(Exception?e)?{
27.e.printStackTrace();
28.}
29.returnbitmap;
30.}
31.//運(yùn)行于UI線程遭铺,對(duì)后臺(tái)任務(wù)的結(jié)果做出處理丽柿,doInBackground方法執(zhí)行的結(jié)果作為此方法的參數(shù)
32.@Override
33.protectedvoidonPostExecute(Bitmap?result)?{
34.super.onPostExecute(result);
35.ImageView?imageView?=?(ImageView)?findViewById(R.id.image);
36.imageView.setImageBitmap(result);
37.progressBar.setVisibility(View.GONE);
38.}
39.//運(yùn)行于UI線程,如果在doInBackground(Params...)中使用了publishProgress(Progress...)魂挂,就會(huì)觸發(fā)此方法
40.@Override
41.protectedvoidonProgressUpdate(Integer...?values)?{
42.super.onProgressUpdate(values);
43.progressBar.setProgress(values[0]);
44.}
45.}
```