異步任務(AsyncTask)

  Android的UI線程主要負責處理用戶的按鍵事件、用戶觸屏事件及屏幕繪圖事件等,所以開發者的其餘操做不該該、也不能阻塞UI線程,不然UI界面將會變得中止響應——用戶感受很是糟糕。(總之,開發者須要牢記:不要再UI線程中執行一些耗時的操做)。程序員

  爲了不UI線程失去響應的問題,Android建議將耗時操做放在新線程中完成,但新線程也可能須要動態更新UI組件:好比須要從網上獲取一個網頁,而後再TextView中將其源代碼顯示出來,此時就應該將鏈接網絡、獲取網絡數據的操做放在新線程中完成。問題是:獲取網絡數據以後,新線程不容許直接更新UI組件。編程

  爲了解決新線程不能更新UI組件的問題,Android提供了以下幾種解決方案:網絡

  一、使用Handler實現線程之間的通訊.異步

  二、Activity.runOnUiThread(Runnable).post

  三、View.post(Runnable).線程

  四、View.postDelayed(Runnable,long).繼承

  後面三種方式可能致使編程略顯煩瑣,而異步任務(AsyncTask)則可進一步簡化這種操做。事件

      AsyncTask<>是一個抽象類,一般用於被繼承,繼承 AsyncTask 時須要指定以下三個泛型參數。開發

  相對來講 AsyncTask 更輕量一些,適用於簡單的異步處理,不須要藉助線程和Handler便可實現。it

  AsyncTask<Params,Progress,Result>是抽象類,它定義了以下三種泛型類型。

    一、Params:啓動任務執行的輸入參數的類型

    二、Progress:後臺任務完成的進度值的類型

    三、Result:後臺執行任務完成後返回結果的類型。

  使用AsyncTask只要以下三步便可。

    一、建立 AsyncTask 的子類,併爲三個泛型參數指定類型。若是某個泛型參數不須要指定類型,可將它指定爲Void

    二、根據須要,實現 AsyncTask 的以下方法:

      2.一、doInBackground(Params...):重寫該方法就是後臺線程將要完成的任務。該方法能夠調用publishProgress(Progress..values)方法更新任務的執行進度。

      2.二、onProgressUpdate(Progress...values):在doInBackground()方法中調用publishProgress()方法更新任務的執行進度後,將會觸發該方法。

      2.三、onPreExecute():該方法將在執行後臺耗時操做前被調用。一般該方法用於完成一些初始化的準備工做,好比在界面上顯示進度條等。

      2.四、onPostExecute(Result result):當doInBackground()完成後,系統會自動調用onPostExecute()方法,並將doInBackground()方法的返回值傳給該方法.

    三、調用 AsyncTask 子類的實例 execute(Params ... params)開始執行耗時任務。

  使用AsyncTask 是必須遵照以下規則

    一、必須在UI線程中建立 AsyncTask 的實例

    二、必須在UI線程中調用 AsyncTask 的execute()方法

    三、AsyncTask 的 onPreExecute()、onPostExecute(Result  result)、doInBackground(Params... params),onProgressUpdate(Progress...values)方法,不該該由程序員代碼調用,而是由Android系統負責調用。

    四、每一個 AsyncTask 只能被執行一次,屢次調用將會引起異常。  

相關文章
相關標籤/搜索