posts - 101,  comments - 29,  trackbacks - 0

          <一>AsyncTask實(shí)現(xiàn)異步處理任務(wù)

          在開(kāi)發(fā)Android應(yīng)用時(shí)必須遵守單線(xiàn)程模型的原則: Android UI操作并不是線(xiàn)程安全的并且這些操作必須在UI線(xiàn)程中執(zhí)行。在單線(xiàn)程模型中始終要記住兩條法則: 
          1. 不要阻塞UI線(xiàn)程 
          2. 確保只在UI線(xiàn)程中訪(fǎng)問(wèn)Android UI工具包 
              當(dāng)一個(gè)程序第一次啟動(dòng)時(shí),Android會(huì)同時(shí)啟動(dòng)一個(gè)對(duì)應(yīng)的主線(xiàn)程(Main Thread),主線(xiàn)程主要負(fù)責(zé)處理與UI相關(guān)的事件,如:用戶(hù)的按鍵事件,用戶(hù)接觸屏幕的事件以及屏幕繪圖事件,并把相關(guān)的事件分發(fā)到對(duì)應(yīng)的組件進(jìn)行處理。所以主線(xiàn)程通常又被叫做UI線(xiàn)程。 
             比如說(shuō)從網(wǎng)上獲取一個(gè)網(wǎng)頁(yè),在一個(gè)TextView中將其源代碼顯示出來(lái),這種涉及到網(wǎng)絡(luò)操作的程序一般都是需要開(kāi)一個(gè)線(xiàn)程完成網(wǎng)絡(luò)訪(fǎng)問(wèn),但是在獲得頁(yè)面源碼后,是不能直接在網(wǎng)絡(luò)操作線(xiàn)程中調(diào)用TextView.setText().因?yàn)槠渌€(xiàn)程中是不能直接訪(fǎng)問(wèn)主UI線(xiàn)程成員 


          <二>Android提供了一些其他線(xiàn)程中訪(fǎng)問(wèn)UI線(xiàn)程的方法
          Activity.runOnUiThread( Runnable ) 
          View.post( Runnable ) 
          View.postDelayed( Runnable, long ) 
          Hanlder 
          但是這些類(lèi)或方法都有一些問(wèn)題。會(huì)使你的代碼很復(fù)雜很難理解。實(shí)現(xiàn)一些很復(fù)雜的操作并需要頻繁地更新UI時(shí)這會(huì)變得更糟糕。 
          為了解決這個(gè)問(wèn)題,Android 提供了一個(gè)工具類(lèi):AsyncTask,它使創(chuàng)建需要與用戶(hù)界面交互的長(zhǎng)時(shí)間運(yùn)行的任務(wù)變得更簡(jiǎn)單。不需要借助線(xiàn)程和Handler即可實(shí)現(xiàn)。 

          <三>AsyncTask操作步驟

          AsyncTask的執(zhí)行分為四個(gè)步驟,每一步都對(duì)應(yīng)一個(gè)回調(diào)方法,這些方法不應(yīng)該由應(yīng)用程序調(diào)用,開(kāi)發(fā)者需要做的就是實(shí)現(xiàn)這些方法。 

          <1> 子類(lèi)化AsyncTask 

          AsyncTask是抽象類(lèi) ,我們必須自己寫(xiě)一個(gè)類(lèi)來(lái)繼承AsyncTask 類(lèi)

          <2>實(shí)現(xiàn)AsyncTask中定義的下面方法 (很關(guān)鍵)

          onPreExecute()                                  該方法將在執(zhí)行實(shí)際的后臺(tái)操作前被UI thread調(diào)用。這個(gè)方法只是做一些準(zhǔn)備工作,如在界面上顯示一個(gè)進(jìn)度條。 

          doInBackground(Params...),              將在onPreExecute 方法執(zhí)行后馬上執(zhí)行,該方法運(yùn)行在后臺(tái)線(xiàn)程中。這里將主要負(fù)責(zé)執(zhí)行那些很耗時(shí)的后臺(tái)計(jì)算工作。 

          publishProgress                                 該方法來(lái)更新實(shí)時(shí)的任務(wù)進(jìn)度。該方法是抽象方法,子類(lèi)必須實(shí)現(xiàn)。 

           onProgressUpdate(Progress...),        publishProgress方法被調(diào)用后,UI thread將調(diào)用這個(gè)方法從而在界面上展示任務(wù)的進(jìn)展情況,可以通過(guò)一個(gè)進(jìn)度條進(jìn)行展示。 

          onPostExecute(Result),                     doInBackground 執(zhí)行完成后,onPostExecute 方法將被UI thread調(diào)用,后臺(tái)的計(jì)算結(jié)果將通過(guò)該方法傳遞到UI thread. 

          <四>AsyncTask遵守準(zhǔn)則

          為了正確的使用AsyncTask類(lèi),以下是幾條必須遵守的準(zhǔn)則: 
          <1>Task的實(shí)例必須在UI thread中創(chuàng)建 
          <2>execute方法必須在UI thread中調(diào)用 
          <3>不要手動(dòng)的調(diào)用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)這幾個(gè)方法 
          <4> task只能被執(zhí)行一次,否則多次調(diào)用時(shí)將會(huì)出現(xiàn)異常

          <五>AsyncTask的泛型

          AsyncTask定義了三種泛型類(lèi)型 Params,ProgressResult。 
          Params         啟動(dòng)任務(wù)執(zhí)行的輸入?yún)?shù),比如HTTP請(qǐng)求的URL。 
          Progress       后臺(tái)任務(wù)執(zhí)行的百分比。 
          Result          后臺(tái)執(zhí)行任務(wù)最終返回的結(jié)果,比如String。

          不是所有類(lèi)型都總是被異步任務(wù)使用。如果標(biāo)記哪個(gè)參數(shù)不用,只是用void代替就可以了。

          <六>取消異步任務(wù)

          只要調(diào)用 cancel(boolean)方法,一個(gè)異步任務(wù)可以隨時(shí)取消。調(diào)用這個(gè)方法會(huì)導(dǎo)致后來(lái)的調(diào)用isCancelled()返回true。

          確保任務(wù)被取消盡可能快,你應(yīng)該總是定期從doInBackground(Object[])中檢查isCancelled()返回值。




          具體實(shí)現(xiàn):

          注意:添加網(wǎng)絡(luò)權(quán)限:

          mian.xml



          posted on 2012-03-30 17:12 mixer-a 閱讀(216) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 永新县| 商水县| 鹤峰县| 富宁县| 仁寿县| 广灵县| 松桃| 浠水县| 永靖县| 缙云县| 高唐县| 万州区| 康马县| 日喀则市| 宁城县| 青阳县| 辽宁省| 淄博市| 宜春市| 文成县| 宁城县| 永仁县| 乐陵市| 奉贤区| 咸阳市| 罗源县| 渭源县| 巴东县| 南京市| 扎囊县| 铁岭市| 新龙县| 霍林郭勒市| 蛟河市| 丹巴县| 贵南县| 库伦旗| 青浦区| 石城县| 梁平县| 新丰县|