AsyncTaske簡單理解

關(guān)于AsyncTask的解釋米愿,Google上面是這樣說的:

AsyncTask enables proper and easy use of the UI thread. This class allows you to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers.

An asynchronous task is defined by a computation that runs on a background thread and whose result is published on the UI thread. An asynchronous task is defined by 3 generic types, called Params, Progress and Result, and 4 steps, called onPreExecute, doInBackground, onProgressUpdate and onPostExecute.

大概意思就是說“它使創(chuàng)建異步任務(wù)變得更加簡單,不再需要編寫任務(wù)線程和Handler實例即可完成相同的任務(wù)鼻吮。一個異步任務(wù)通常是在后臺運行的計算等然后將結(jié)果發(fā)送到UI主線程中去育苟。通常情況下,異步任務(wù)被定義為3種通用類型椎木,分別為:參數(shù)违柏、過程以及結(jié)果和4個步驟,分別為“onPreExecute香椎、doInBackground漱竖、onProgressUpdate、onPostExecute””這就是關(guān)于異步任務(wù)的大概說明畜伐。

怎么來理解AsyncTask呢闲孤?通俗一點來說,AsyncTask就相當(dāng)于Android給我們提供了一個多線程編程的一個框架烤礁,其介于Thread和Handler之間,我們?nèi)绻x一個AsyncTask肥照,就需要定義一個類來繼承AsyncTask這個抽象類脚仔,并實現(xiàn)其唯一的一個 doInBackgroud 抽象方法。要掌握AsyncTask舆绎,我們就必須要一個概念鲤脏,總結(jié)起來就是: 3個泛型,4個步驟吕朵。

3個泛型

3個泛型指的是什么呢猎醇?我們來看看AsyncTask這個抽象類的定義,當(dāng)我們定義一個類來繼承AsyncTask這個類的時候努溃,我們需要為其指定3個泛型參數(shù):

public abstractclassAsyncTask

Params:這個泛型指定的是我們傳遞給異步任務(wù)執(zhí)行時的參數(shù)的類型

Progress:這個泛型指定的是我們的異步任務(wù)在執(zhí)行的時候?qū)?zhí)行的進度返回給UI線程的參數(shù)的類型

Result:這個泛型指定的異步任務(wù)執(zhí)行完后返回給UI線程的結(jié)果的類型

4個步驟

4個步驟:當(dāng)我們執(zhí)行一個異步任務(wù)的時候硫嘶,其需要按照下面的4個步驟分別執(zhí)行:

1、onPreExecute():

這個方法是在執(zhí)行異步任務(wù)之前的時候執(zhí)行梧税,并且是在UI Thread當(dāng)中執(zhí)行的沦疾,通常我們在這個方法里做一些UI控件的初始化的操作称近,例如彈出要給ProgressDialog。

2哮塞、doInBackground(Params... params):

在onPreExecute()方法執(zhí)行完之后刨秆,會馬上執(zhí)行這個方法,這個方法就是來處理異步任務(wù)的方法忆畅,Android操作系統(tǒng)會在后臺的線程池當(dāng)中開啟一個worker thread來執(zhí)行我們的這個方法衡未,所以這個方法是在worker thread當(dāng)中執(zhí)行的,這個方法執(zhí)行完之后就可以將我們的執(zhí)行結(jié)果發(fā)送給我們的最后一個 onPostExecute 方法家凯,在這個方法里缓醋,我們可以從網(wǎng)絡(luò)當(dāng)中獲取數(shù)據(jù)等一些耗時的操作。

3肆饶、onProgressUpdate(Progess... values):

這個方法也是在UI Thread當(dāng)中執(zhí)行的改衩,我們在異步任務(wù)執(zhí)行的時候,有時候需要將執(zhí)行的進度返回給我們的UI界面驯镊,例如下載一張網(wǎng)絡(luò)圖片葫督,我們需要時刻顯示其下載的進度,就可以使用這個方法來更新我們的進度板惑。這個方法在調(diào)用之前橄镜,我們需要在 doInBackground 方法中調(diào)用一個 publishProgress(Progress) 的方法來將我們的進度時時刻刻傳遞給 onProgressUpdate 方法來更新。

4冯乘、onPostExecute(Result... result):

當(dāng)我們的異步任務(wù)執(zhí)行完之后洽胶,就會將結(jié)果返回給這個方法,這個方法也是在UI Thread當(dāng)中調(diào)用的裆馒,我們可以將返回的結(jié)果顯示在UI控件上姊氓。

為什么我們的AsyncTask抽象類只有一個 doInBackground 的抽象方法呢?喷好?原因是翔横,我們?nèi)绻鲆粋€異步任務(wù),我們必須要為其開辟一個新的Thread梗搅,讓其完成一些操作禾唁,而在完成這個異步任務(wù)時,我可能并不需要彈出要給ProgressDialog无切,我并不需要隨時更新我的ProgressDialog的進度條荡短,我也并不需要將結(jié)果更新給我們的UI界面,所以除了 doInBackground 方法之外的三個方法哆键,都不是必須有的掘托,因此我們必須要實現(xiàn)的方法是 doInBackground 方法。


**簡單使用**

//進度框顯示progressDialog =newProgressDialog(MainActivity.this);

progressDialog.setTitle("提示信息");

progressDialog.setMessage("正在下載中籍嘹,請稍后......");//? ? 設(shè)置setCancelable(false); 表示我們不能取消這個彈出框烫映,等下載完成之后再讓彈出框消失progressDialog.setCancelable(false);//? ? 設(shè)置ProgressDialog樣式為水平的樣式progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//下載類publicclassMyAsyncTaskextendsAsyncTask{

@Override

protectedvoidonPreExecute() {super.onPreExecute();//? ? 在onPreExecute()中我們讓ProgressDialog顯示出來progressDialog.show();

}

@Override

protected Bitmap doInBackground(String... params) {

Bitmap bitmap =null;try{

URL url =newURL(params[0]);

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

conn.setConnectTimeout(5*1000);

conn.setRequestMethod("GET");

InputStream inputStream = conn.getInputStream();if(conn.getResponseCode() == HttpURLConnection.HTTP_OK) {

int fileLength = conn.getContentLength();

ByteArrayOutputStream outStread =newByteArrayOutputStream();

byte[] buffer =newbyte[1024];

int length =0;

long total =0;while((length = inputStream.read(buffer)) !=-1) {

outStread.write(buffer,0, length);

total += length;if(fileLength >0) {

publishProgress((int) (total *100/ fileLength));

}

}

outStread.close();

inputStream.close();

byte[] data = outStread.toByteArray();if(data !=null) {

bitmap = BitmapFactory.decodeByteArray(data,0, data.length);

}else{

Toast.makeText(MainActivity.this,"Image error!", Toast.LENGTH_LONG).show();

}returnbitmap;

}

}catch(Exception e) {

e.printStackTrace();

}returnnull;

}

@Override

protectedvoidonProgressUpdate(Integer... values) {super.onProgressUpdate(values);//? ? 更新ProgressDialog的進度條progressDialog.setProgress(values[0]);

}

@Override

protectedvoidonPostExecute(Bitmap bitmap) {super.onPostExecute(bitmap);

imageView.setImageBitmap(bitmap);try{

saveFile(bitmap,"netpic.jpg");

}catch(IOException e) {

e.printStackTrace();

}

progressDialog.dismiss();

}

}//在UI主線程中執(zhí)行下載程序StringpicUrl ="http://img3.imgtn.bdimg.com/it/u=2437337628,1430863508&fm=214&gp=0.jpg";newMyAsyncTask().execute(picUrl);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沼本,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子锭沟,更是在濱河造成了極大的恐慌抽兆,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件族淮,死亡現(xiàn)場離奇詭異辫红,居然都是意外死亡,警方通過查閱死者的電腦和手機祝辣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門贴妻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蝙斜,你說我怎么就攤上這事名惩。” “怎么了孕荠?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵娩鹉,是天一觀的道長。 經(jīng)常有香客問我稚伍,道長弯予,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任个曙,我火速辦了婚禮锈嫩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘垦搬。我一直安慰自己呼寸,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布猴贰。 她就那樣靜靜地躺著等舔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪糟趾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天甚牲,我揣著相機與錄音义郑,去河邊找鬼。 笑死丈钙,一個胖子當(dāng)著我的面吹牛非驮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播雏赦,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼劫笙,長吁一口氣:“原來是場噩夢啊……” “哼芙扎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起填大,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤戒洼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后允华,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體圈浇,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年靴寂,在試婚紗的時候發(fā)現(xiàn)自己被綠了磷蜀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡百炬,死狀恐怖褐隆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情剖踊,我是刑警寧澤庶弃,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站蜜宪,受9級特大地震影響虫埂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜圃验,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一掉伏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧澳窑,春花似錦斧散、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至麻裁,卻和暖如春箍镜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背煎源。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工色迂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人手销。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓歇僧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親锋拖。 傳聞我的和親對象是個殘疾皇子诈悍,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容

  • Android開發(fā)者:你真的會用AsyncTask嗎祸轮? 導(dǎo)讀.1 在Android應(yīng)用開發(fā)中,我們需要時刻注意保證...
    cxm11閱讀 2,703評論 0 29
  • 1 AsyncTask異步任務(wù) 1.1ANR的概念 Application Not Responding侥钳,應(yīng)用...
    征程_Journey閱讀 1,147評論 0 6
  • Android Handler機制系列文章整體內(nèi)容如下: Android Handler機制1之ThreadAnd...
    隔壁老李頭閱讀 3,193評論 1 15
  • 1.手勢的腿和拉:推靠胸适袜,拉靠肩胛骨;上半身的推拉關(guān)系與腿部的關(guān)系慕趴;推拉的延伸要到位痪蝇,并且與跨位要協(xié)調(diào)一致。 2....
    性感有才的郭郭閱讀 259評論 0 0
  • 我看見 江岸兩旁的烏桕 迎風(fēng)搖曳著鮮紅 漫山遍野 不下丹楓 我走至 煙雨迷蒙的街頭 轉(zhuǎn)眸遠眺那青蔥 四月花期 輕綴...
    余攸玉閱讀 280評論 0 0