異步處理中使用AsyncTask踩過的坑

Android應(yīng)用界面開發(fā)

第三章學(xué)習(xí)

第三部分####


異步處理中使用AsyncTask踩過的坑####

AsyncTask是Android提供的工具之一,可以簡單方便地用于子線程更新UI,他也是個(gè)抽象類,使用時(shí)需要重寫其方法,根據(jù)定義時(shí)傳入的3個(gè)參數(shù)類型來判斷重寫哪些,但必須要重寫doInBackground()。
能夠通過getStatus()方法返回線程的工作狀態(tài),如“PENDING,RUNNING,FINISHED”分別表示“準(zhǔn)備中,運(yùn)行中,已完成”。


知識(shí)點(diǎn):

以下是Android官方文檔關(guān)于自定義AsyncTask類的范例:

 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
 protected Long doInBackground(URL... urls) {
 int count = urls.length;
 long totalSize = 0;
 for (int i = 0; i < count; i++) {
 totalSize += Downloader.downloadFile(urls[i]);
 publishProgress((int) ((i / (float) count) * 100));
 // Escape early if cancel() is called
 if (isCancelled()) break;
 }
 return totalSize;
 }

 protected void onProgressUpdate(Integer... progress) {
 setProgressPercent(progress[0]);
 }

 protected void onPostExecute(Long result) {
 showDialog("Downloaded " + result + " bytes");
 }
 }

先說重寫的方法:

  1. onPreExecute()
    這個(gè)方法會(huì)在后臺(tái)任務(wù)開始執(zhí)行之前調(diào)用,用于進(jìn)行一些界面上的初始化操作,比如顯示一個(gè)進(jìn)度條對(duì)話框等。

  2. doInBackground(URL... urls)
    這個(gè)方法中的所有代碼都會(huì)在子線程中運(yùn)行,我們應(yīng)該在這里去處理所有的耗時(shí)任務(wù)。任務(wù)一旦完成就可以通過 return 語句來將任務(wù)的執(zhí)行結(jié)果返回,如果 AsyncTask的第三個(gè)泛型參數(shù)指定的是 Void,就可以不返回任務(wù)執(zhí)行結(jié)果。注意,在這個(gè)方法中是不可以進(jìn)行 UI 操作的,如果需要更新 UI 元素,比如說反饋當(dāng)前任務(wù)的執(zhí)行進(jìn)度,可以調(diào)用 publishProgress(Progress...)方法來完成。

  3. onProgressUpdate(Integer... progress)
    當(dāng)在后臺(tái)任務(wù)中調(diào)用了 publishProgress(Progress...)方法后,這個(gè)方法就會(huì)很快被調(diào)用,方法中攜帶的參數(shù)就是在后臺(tái)任務(wù)中傳遞過來的。在這個(gè)方法中可以對(duì) UI 進(jìn)行操作,利用參數(shù)中的數(shù)值就可以對(duì)界面元素進(jìn)行相應(yīng)地更新。

  4. onPostExecute(Long result)
    當(dāng)后臺(tái)任務(wù)執(zhí)行完畢并通過 return 語句進(jìn)行返回時(shí),這個(gè)方法就很快會(huì)被調(diào)用。返回的數(shù)據(jù)會(huì)作為參數(shù)傳遞到此方法中,可以利用返回的數(shù)據(jù)來進(jìn)行一些 UI 操作,比如說提醒任務(wù)執(zhí)行的結(jié)果,以及關(guān)閉掉進(jìn)度條對(duì)話框等。

顯然,由定義時(shí)指定的3個(gè)泛型參數(shù)< URL, Integer, Long >,就是重寫的方法中對(duì)應(yīng)的3個(gè)方法所接收的類型。
順序如下:

URL-->doInBackground(URL)-->publishProgress(Integer)-->onProgressUpdate(Integer),使用Integer進(jìn)行UI更新。
以及URL-->doInBackground(URL)-->return Long-->onPostExecute(Long),進(jìn)行結(jié)果展示

要啟動(dòng)的時(shí)候,使用下方語句即可

new DownloadFilesTask().execute();

這是第一個(gè)坑

當(dāng)內(nèi)部子線程運(yùn)行完畢,則AsyncTask進(jìn)入onPostExecute()方法,然后狀態(tài)變?yōu)镕INISHED,再次調(diào)用不可

而cancel()這方法就更不可思議了,分為cancel(false)軟取消,和cancel(true)硬取消,使用第一個(gè)方法時(shí),系統(tǒng)會(huì)自動(dòng)判斷取消的時(shí)機(jī),第二個(gè)方法是立即取消,不建議時(shí)候后者。
可是!其實(shí)甭管軟硬,這AsyncTask都不一定吃……用了也沒反應(yīng)……他總是在他喜歡的時(shí)候才停止……這怎么控制啊,于是……關(guān)于AsyncTask狀態(tài)的判斷就顯得很重要了……


這里,我碰到了第二個(gè)坑

一般為了后臺(tái)實(shí)時(shí)更新進(jìn)度條,泛型只會(huì)設(shè)置為AsyncTask< Void, Integer, Void>其中Integer用來更新進(jìn)度條,在onProgressUpdate()中使用此方法:


確實(shí)順利更新了進(jìn)度條,那,我順便還想同時(shí)更新邊上的進(jìn)度文字呢?
初步設(shè)想,傳2個(gè)參數(shù)String和Integer到onProgressUpdate()中分別更新TextView和SeekBar。

能行嗎?因?yàn)橹荒軅饕粋€(gè)參數(shù)給onProgressUpdate(),使用String[]數(shù)組作為中間的參數(shù):

AsyncTask<Void, String[], Void>

然后通過把其中代表進(jìn)度的字符串轉(zhuǎn)為int,用來setProgress?
以上失敗了
用Buldle呢? 失敗
Map呢? 失敗

這什么鬼啊!!能用???


網(wǎng)上找啊找,關(guān)于AsyncTask的范例全都寫得一模一樣,只有更新seekbar等一個(gè)UI的。思考了一夜,第二天…………


只給onProgressUpdate()傳入一個(gè)參數(shù),而更新,則靠這個(gè)參數(shù)來轉(zhuǎn)變?yōu)?個(gè)UI所需的數(shù)據(jù)


而MusicService中有個(gè)將毫秒轉(zhuǎn)變?yōu)镾tring型“00:00”格式的方法

竟然成功了!原來,AsyncTask中間這泛型,其實(shí)能支持的類型有限吧!(我猜的!),給他2個(gè)參數(shù)時(shí),運(yùn)行一次就FINISHED了。所以,需要更新多個(gè)UI時(shí)候,使用AsyncTask還是得多考慮考慮。

--完--

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評(píng)論 6 546
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,814評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評(píng)論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評(píng)論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,779評(píng)論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,109評(píng)論 1 330
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評(píng)論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,287評(píng)論 0 291
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,799評(píng)論 1 338
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,515評(píng)論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,750評(píng)論 1 375
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,933評(píng)論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評(píng)論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,492評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,703評(píng)論 2 380

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

  • 在Android中我們可以通過Thread+Handler實(shí)現(xiàn)多線程通信,一種經(jīng)典的使用場(chǎng)景是:在新線程中進(jìn)行耗時(shí)...
    呂侯爺閱讀 2,066評(píng)論 2 23
  • Android開發(fā)者:你真的會(huì)用AsyncTask嗎? 導(dǎo)讀.1 在Android應(yīng)用開發(fā)中,我們需要時(shí)刻注意保證...
    cxm11閱讀 2,729評(píng)論 0 29
  • Android Handler機(jī)制系列文章整體內(nèi)容如下: Android Handler機(jī)制1之ThreadAnd...
    隔壁老李頭閱讀 3,254評(píng)論 1 15
  • 時(shí)間不緊不慢,不偏不倚,大概是這世上最公正無私的了。哪怕是陽光雨露,也會(huì)有所偏袒,唯有時(shí)間,從不對(duì)誰眷顧有加,也從...
    小時(shí)光閣樓閱讀 337評(píng)論 0 1
  • 不知何時(shí) 心變得耐壓 抗寒 聽得了冷言 裝的下惡語 我不會(huì)把一時(shí)的心寒 當(dāng)作美味佳肴 去品 去回味 只要你給個(gè)臺(tái)階...
    筆尖的流浪閱讀 206評(píng)論 0 1