Android 開發(六)AsyncTask

來源:互聯網
上載者:User

1:AsyncTask是多線程嗎?
答:是。
2:AsyncTask與Handler相比,誰更輕量級?
答:通過看源碼,發現AsyncTask實際上就是一個線程池,而網上的說法是AsyncTask比handler要輕量級,顯然上不準確的,只能這樣
說,AsyncTask在代碼上比handler要輕量層級,而實際上要比handler更耗資源,因為AsyncTask底層是一個線程池!而
Handler僅僅就是發送了一個訊息佇列,連線程都沒有開。
      但是,如果非同步任務的資料特別龐大,AsyncTask這種線程池結構的優勢就體現出來了。

AsyncTask 的優勢體現在:
•線程的開銷較大,如果每個任務都要建立一個線程,那麼應用程 序的效率要低很多;
•線程無法管理,匿名線程建立並啟動後就不受程式的控制了,如果有很多個請求發送,那麼就會啟動非常多的線程,系統將不堪重負。
•另外,前面已經看到,在新線程中更新UI還必須要引入handler,這讓代碼看上去非常臃腫。

AsyncTask定義了三種泛型型別 Params,Progress和Result。
    •Params 啟動任務執行的輸入參數,比如HTTP請求的URL。
    •Progress 背景工作執行的百分比。
    •Result 後台執行任務最終返回的結果,比如String。

       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只能被執行一次,否則多次調用時將會出現異常

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.