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