AsyncTask的用法總結

 在開發Android移動客戶端的時候每每要使用多線程來進行操做,咱們一般會將耗時的操做放在單獨的線程執行,避免其佔用主線程而給用戶帶來很差的用戶體驗。可是在子線程中沒法去操做主線程(UI 線程),在子線程中操做UI線程會出現錯誤。所以android提 供了一個類Handler來在子線程中來更新UI線程,用發消息的機制更新UI界面,呈現給用戶。這樣就解決了子線程更新UI的問題。可是費時的任務操做 總會啓動一些匿名的子線程,太多的子線程給系統帶來巨大的負擔,隨之帶來一些性能問題。所以android提供了一個工具類AsyncTask,顧名思義 異步執行任務。這個AsyncTask生來就是處理一些後臺的比較耗時的任務,給用戶帶來良好用戶體驗的,從編程的語法上顯得優雅了許多,再也不須要子線程 和Handler就能夠完成異步操做而且刷新用戶界面。android

        先大概認識下Android.os.AsyncTask類:編程

       * android的類AsyncTask對線程間通信進行了包裝,提供了簡易的編程方式來使後臺線程和UI線程進行通信:後臺線程執行異步任務,並把操做結果通知UI線程。安全

       * AsyncTask是抽象類.AsyncTask定義了三種泛型類型 Params,Progress和Result。
   * Params 啓動任務執行的輸入參數,好比HTTP請求的URL。
   * Progress 後臺任務執行的百分比。
    * Result 後臺執行任務最終返回的結果,好比String,Integer等。
網絡

       * AsyncTask的執行分爲四個步驟,每一步都對應一個回調方法,開發者須要實現這些方法。多線程

   * 1) 繼承AsyncTask
    * 2) 實現AsyncTask中定義的下面一個或幾個方法
       * onPreExecute(), 該方法將在執行實際的後臺操做前被UI 線程調用。能夠在該方法中作一些準備工做,如在界面上顯示一個進度條,或者一些控件的實例化,這個方法能夠不用實現。
       * doInBackground(Params...), 將在onPreExecute 方法執行後立刻執行,該方法運行在後臺線程中。這裏將主要負責執行那些很耗時的後臺處理工做。能夠調用 publishProgress方法來更新實時的任務進度。該方法是抽象方法,子類必須實現。
      * onProgressUpdate(Progress...),在publishProgress方法被調用後,UI 線程將調用這個方法從而在界面上展現任務的進展狀況,例如經過一個進度條進行展現。
      * onPostExecute(Result), 在doInBackground 執行完成後,onPostExecute 方法將被UI 線程調用,後臺的計算結果將經過該方法傳遞到UI 線程,而且在界面上展現給用戶.
異步

      * onCancelled(),在用戶取消線程操做的時候調用。在主線程中調用onCancelled()的時候調用。工具

爲了正確的使用AsyncTask類,如下是幾條必須遵照的準則:post

      1) Task的實例必須在UI 線程中建立性能

      2) execute方法必須在UI 線程中調用spa

      3) 不要手動的調用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)這幾個方法,須要在UI線程中實例化這個task來調用。

      4) 該task只能被執行一次,不然屢次調用時將會出現異常

      doInBackground方法和onPostExecute的參數必須對應,這兩個參數在AsyncTask聲明的泛型參數列表中指定,第一個爲 doInBackground接受的參數,第二個爲顯示進度的參數,第第三個爲doInBackground返回和onPostExecute傳入的參 數。

 

//AsyncTask<>的參數類型由用戶設定,這裏設爲三個String
//第一個String表明輸入到任務的參數類型,也便是doInBackground()的參數類型
//第二個String表明處理過程當中的參數類型,也就是doInBackground()執行過程當中的產出參數類型,經過publishProgress()發消息
//傳遞給onProgressUpdate()通常用來更新界面
//第三個String表明任務結束的產出類型,也就是doInBackground()的返回值類型,和onPostExecute()的參數類型
private class task extends AsyncTask<String, String, String>

 

 

AsyncTask是抽象類,子類必須實現抽象方法doInBackground(Params... p) ,在此方法中實現任務的執行工做,好比鏈接網絡獲取數據等。 
一般還應該實現onPostExecute(Result r) 方法,由於應用程序關心的結果在此方法中返回。須要注意的是AsyncTask必定要在主線程中建立實例。AsyncTask定義了三種泛型類型 Params,Progress和Result。 
    * Params 啓動任務執行的輸入參數,好比HTTP請求的URL。 
    * Progress 後臺任務執行的百分比。 
    * Result 後臺執行任務最終返回的結果,好比String。

 

       AsyncTask 的執行分爲四個步驟,每一步都對應一個回調方法,須要注意的是這些方法不該該由應用程序調用,開發者須要作的就是實現這些方法。在任務的執行過程當中,這些方法被自動調用。

 

    * onPreExecute() 當任務執行以前開始調用此方法,能夠在這裏顯示進度對話框。 
    * doInBackground(Params...) 此方法在後臺線程 執行,完成任務的主要工做,一般須要較長的時間。在執行過程當中能夠調用publicProgress(Progress...)來更新任務的進度。 
    * onProgressUpdate(Progress...) 此方法在主線程 執行,用於顯示任務執行的進度。 
    * onPostExecute(Result) 此方法在主線程 執行,任務執行的結果做爲此方法的參數返回

 

  1.  AsyncTask的三個泛型參數說明(三個參數能夠是任何類型) 

  2.     第一個參數:傳入doInBackground()方法的參數類型 

  3.     第二個參數:傳入onProgressUpdate()方法的參數類型 

  4.     第三個參數:傳入onPostExecute()方法的參數類型,也是doInBackground()方法返回的類型

=====================================================================================================

再來就是用法:

=====================================================================================================

在開發Android應用時必須遵照單線程模型的原則: Android UI操做並非線程安全的而且這些操做必須在UI線程中執行。在單線程模型中始終要記住兩條法則: 
1. 不要阻塞UI線程 
2. 確保只在UI線程中訪問Android UI工具包 
      當一個程序第一次啓動時,Android會同時啓動一個對應的主線程(Main Thread),主線程主要負責處理與UI相關的事件,如:用戶的按鍵事件,用戶接觸屏幕的事件以及屏幕繪圖事件,並把相關的事件分發到對應的組件進行處 理。因此主線程一般又被叫作UI線程。 
      好比說從網上獲取一個網頁,在一個TextView中將其源代碼顯示出來,這種涉及到網絡操做的程序通常都是須要開一個線程完成網絡訪問,可是在得到頁 面源碼後,是不能直接在網絡操做線程中調用TextView.setText()的.由於其餘線程中是不能直接訪問主UI線程成員 。

android提供了幾種在其餘線程中訪問UI線程的方法。 Activity.runOnUiThread( Runnable ) View.post( Runnable ) View.postDelayed( Runnable, long ) Hanlder 這些類或方法一樣會使你的代碼很複雜很難理解。然而當你須要實現一些很複雜的操做並須要頻繁地更新UI時這會變得更糟糕。      爲了解決這個問題,Android 1.5提供了一個工具類:AsyncTask,它使建立須要與用戶界面交互的長時間運行的任務變得更簡單。相對來講AsyncTask更輕量級一些,適用於簡單的異步處理,不須要藉助線程和Handler便可實現。 AsyncTask是抽象類.AsyncTask定義了三種泛型類型 Params,Progress和Result。   Params 啓動任務執行的輸入參數,好比HTTP請求的URL。   Progress 後臺任務執行的百分比。   Result 後臺執行任務最終返回的結果,好比String。      AsyncTask的執行分爲四個步驟,每一步都對應一個回調方法,這些方法不該該由應用程序調用,開發者須要作的就是實現這些方法。   1) 子類化AsyncTask   2) 實現AsyncTask中定義的下面一個或幾個方法      onPreExecute(), 該方法將在執行實際的後臺操做前被UI thread調用。能夠在該方法中作一些準備工做,如在界面上顯示一個進度條。     doInBackground(Params...), 將在onPreExecute 方法執行後立刻執行,該方法運行在後臺線程中。這裏將主要負責執行那些很耗時的後臺計算工做。能夠調用 publishProgress方法來更新實時的任務進度。該方法是抽象方法,子類必須實現。     onProgressUpdate(Progress...),在publishProgress方法被調用後,UI thread將調用這個方法從而在界面上展現任務的進展狀況,例如經過一個進度條進行展現。     onPostExecute(Result), 在doInBackground 執行完成後,onPostExecute 方法將被UI thread調用,後臺的計算結果將經過該方法傳遞到UI thread. 爲了正確的使用AsyncTask類,如下是幾條必須遵照的準則:   1) Task的實例必須在UI thread中建立   2) execute方法必須在UI thread中調用   3) 不要手動的調用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)這幾個方法   4) 該task只能被執行一次,不然屢次調用時將會出現異常       doInBackground方法和onPostExecute的參數必須對應,這兩個參數在AsyncTask聲明的泛型參數列表中指定,第一個爲 doInBackground接受的參數,第二個爲顯示進度的參數,第第三個爲doInBackground返回和onPostExecute傳入的參 數。

相關文章
相關標籤/搜索