Android線程異步處理之AsyncTask

Android應用是單線程模式的。

單線程模式需要記住兩條:

一、防止UI線程阻塞

二、確保只在UI線程中訪問Android UI工具包

在開發Android應用時必須遵守單線程模型的原則:Android UI操作並不是線程安全的並且這些操作必須在UI線程中執行。

在此介紹下何謂UI線程:當一個程序第一次啓動時,Android會同時啓動一個對應的主線程(Main Thread),主線程主要負責處理與UI相關的事件,如:用戶的按鍵事件,用戶接觸屏幕的事件以及屏幕繪圖事件,並把相關的事件分發到對應的組件進行處理。所以主線程通常又被叫做UI線程。

什麼情況下會出現線程阻塞?如在登錄時,一般會去訪問網絡,這個需要一段時間,如果寫帶UI線程中,則會出現界面假死現象,也就是界面卡住不支持用戶交互,這一點在要求高交互的手機上肯定是不能容許的。ok,這個時候你可能會去考慮新開一個線程或者在後臺線程中來執行耗時的操作,如下面的例子:

public void onClick( View v ) { 

 new Thread( new Runnable() {  

     public void run() { 

  Bitmap b = loadImageFromNetwork();   //從網絡上下載圖片

  mImageView.setImageBitmap( b );  //把圖片設置給ImageView

  }

     }).start()

  }

上面的代碼會報錯,你可能會說邏輯很正確啊,但是它違背了Android單線程模型:Android UI操作並不是線程安全的並且這些操作必須在UI線程中執行。

Andriod提供了幾種在其他線程中訪問UI線程的方法:

Activity.runOnUiThread( Runnable )

View.post( Runnable )  

View.postDelayed( Runnable, long )  

Hanlder

下面引人Android的異步處理機制:Handler和AsyncTask。其中AsyncTask比hander更輕量級一些。在Android1.5中提供了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只能被執行一次,否則多次調用時將會出現異常

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