異步任務

異步任務
因爲android ui的線程安全問題,因此當我們需要執行耗時的操作時,一定要在新線程中進行,否則會對主線程造成阻塞,android默認的是當ui線程超過20秒,就會引發anr(application not response)異常,爲了解決這個問題,其實不僅僅可以使用Handler這一種方法,方法還有:
  1.使用Hanlder實現進程之間的通信。
  2.Acitvity.runOnUiThread(Runnable)
  3.View.pose(Runnable)
  4.View.poseDelayed(Runnable,long)
  5.AsyncTask<>
 據說是2.3.4方法有點繁瑣,但是我認爲也不一定都是。
 下面介紹方法5:
  AsyncTask<>是一個抽象類,通常用於被繼承,但是繼承時需要指定如下三個泛型參數。
  AsyncTask更輕量級一些,適用於簡單的異步處理,不需要藉助於線程和Handler即可實現。
  三個泛型參數:
   Params:啓動任務(相當於主線程)執行的輸入參數集合。
   Progress:後臺任務完成的進度值類型。
   Result:後臺執行任務完成後返回的結果類型。
 使用AsyncTask只需要如下的三步:
  一.創建AsyncTask的子類,併爲三個泛型參數指定類型,如果某個參數不需要指定類型,可將他指定爲void。
  二.根據需要,實現AsyncTask的如下方法:
   1.doInBackground(Params):重寫該方法就是後臺線程將要完成的任務,該方法可以調用publishProgress(Progress values)更新任務的執行進度。
   2.onProgressUpdate(Progress values):在doInBackground(Params)方法中調用publishProgress(Progress values)方法更新任務的執行進度後,會觸發該方法。
   3.onPreExecute():該方法將在執行後臺耗時操作前被調用,該方法通常用於完成一些初始化的準備工作,比如在界面上顯示進度條等。
   4.onPostExecute(Result result):當doInBackground完成後,系統會自動調用onPostExecute()方法,並將doInBackground()方法的返回值傳給該方法。
  三,調用AsyncTask子類的實例的execute(Params...params)開始執行耗時的任務,但是必須遵守以下的一些規定。
   1.必須在ui線程中創建AsyncTask的實例
   2.必須在ui線程中調用AsyncTask的execute()方法
   3.上面所說的幾種方法,不應該由程序員調用,而應該由系統調用。
   4.每個AsyncTask只能被執行一次,多次調用將引發異常。


參考文檔《android瘋狂講義》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章