AsyncTask类的使用
????? AsyncTask在包android.os中,使用AsyncTask能夠使得和UI 線程的交互更為簡單合適。它可以用來進(jìn)行后臺的操作,并且把結(jié)果顯示在UI線程上,而不需要程序員自己人為的對線程(Thread or Handler)進(jìn)行控制和管理。
這個類通過3個泛型參數(shù)(params,progress,result),和4個步驟(begin,doinbackground,processProgress,end)來定義。
???? (一)三個泛型參數(shù)params,progress,result
??????????? 這個三個參數(shù)可為任何類型和任何類型的數(shù)組,如果不需要,則用Void代替。
??????????? params對應(yīng)于doInbackground(Params...parames)
??????????? progress對應(yīng)于onProgressUpdate()和publishProgress(Progress...progress),用來反應(yīng)線程執(zhí)行的進(jìn)度,其中publishProgress方法必須在doInBackground方法中調(diào)用。
??????????? 例子:
?????????????Result doInBackground()
???????????????{
A();??????????? //方法A,從網(wǎng)絡(luò)讀取數(shù)據(jù)
??????????????????????this.publishProgress("state1","I like it");
????????????????????? B();????????? //方法B,復(fù)雜的計(jì)算處理
????????????????????? this.publishProgress("state2","for test");
??????????????????????return result;
}
?????????????? onProgressUpdate(String values)
????????????? {
?????????????????? if(values[0].equals("state1"))
??????????????????????????C();????????//將A讀取的數(shù)據(jù)在UI上展現(xiàn)
?????????????????? else if(values[0].equals("state2"))
???????????????????????? Log.e("value",values[1]);????????
}
result后臺進(jìn)程計(jì)算得出的結(jié)果,對應(yīng)于onPostExecute(Result),后臺進(jìn)程得出的結(jié)果,作為參數(shù)傳遞給此方法。
???(二)四個步驟和對應(yīng)的方法
???????????(1)begin和onPreExecute()
????????????????? 任務(wù)啟動后(通過execute()方法啟動任務(wù)),這個步驟用來在UI線程中做一些初始化的工作,比如展現(xiàn)一個進(jìn)度條。
???????????(2)doInBackground和doInBackground()
?????????????????? 當(dāng)onPreExecute()方法執(zhí)行完后,這個步驟立即在后臺線程運(yùn)行,用來處理一些耗時的計(jì)算及其他引起UI線程阻塞的操作,處理的結(jié)果result返回給onPostExecute(Result)方法,
????????????????? 也可以使用publishProgress()和UI線程進(jìn)行交互,上面已有例子。
???????????(3)processProgress和onProgressUpdate()
????????????????? 每次當(dāng)在后臺線程里調(diào)用了publishProgress()方法后,onProgressUpdate()都會在UI線程中執(zhí)行。這個步驟在后臺線程還未結(jié)束時,用來進(jìn)行UI線程和后臺線程的交互。
??????????? (4)end和onPostExecute()
???????????????????當(dāng)后臺線程執(zhí)行完畢之后,后臺線程將得到的結(jié)果傳遞給onPostExecute()方法,這個步驟在UI線程上展現(xiàn)后臺線程執(zhí)行完畢后最終得到的結(jié)果。
????????????上面這四個方法都是只有doInBackground()是在后臺線程中執(zhí)行,其他都是在UI線程中執(zhí)行。 這四個方法都是protected,必須繼承的使用AsyncTask類,必須重寫doInbackground()方法,經(jīng)常還要重寫onPostExecute()方法。
????????????當(dāng)然具體重寫哪些方法根據(jù)實(shí)際需要決定,如果要在后臺進(jìn)程尚未執(zhí)行完成需要和UI交互,就要重寫onProgressUpdate()方法,如果只需要等后臺進(jìn)程執(zhí)行完畢得到結(jié)果后再和UI交互,則重寫onPostExecute()方法就行。
????(三)使用AsyncTask遵循的線程規(guī)則
??????????(1)這個類的實(shí)例必須在UI線程中創(chuàng)建。
??????????(2)execute()必須在UI線程中調(diào)用。
??????????(3)不要自己動手去調(diào)用上面的四個方法。
??????????(4)這個任務(wù)只能被執(zhí)行一次,如果嘗試多次執(zhí)行會拋出異常。
???
????????????????
??????????????????
轉(zhuǎn)載于:https://www.cnblogs.com/ixyx/archive/2011/04/07/AsyncTask.html
總結(jié)
以上是生活随笔為你收集整理的AsyncTask类的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 斐波那契数的实现
- 下一篇: Firefox XUL