1. 程式人生 > >Android的線程和線程池

Android的線程和線程池

ccf pos 在線 bst 網絡請求 四大 ask ron 底層

1、背景

Android中,線程分為主線程和子線程,主線程主要處理和界面相關的事情,而子線程則往往用於執行耗時操作。

除了Thread本身以外,在Android中可以扮演線程角色還有AsynTask和IntentService,同時HandlerThread也是一種特殊的線程。

對於AsynTask來說,它的底層用到了線程池,AsynTask封裝了線程池和Handler,主要是為了方便開發者在子線程中更新UI。

對於IntentService和HandlerThread,它們的底層則直接使用了線程。HandlerThread是一種具有消息循環的線程,在它的內部可以使用Handler。

IntentService是一個服務,系統對其進行了封裝使其可以更方便地執行後臺任務,IntentService內部采用HandlerThread來執行任務,當任務執行完畢後IntentService會自動退出。

Android主線程的作用是運行四大組件以及處理它們和用戶的交互,而子線程的作用則是執行耗時任務,比如網絡請求,io操作等。

2、AsyncTask

AsyncTask是一種輕量級的異步任務類,可以在線程池中執行後臺任務,然後把執行的進度和最終結果傳遞給主線程並在主線程中更新UI。AsyncTask不適合進行特別耗時的後臺任務,對於特別耗時的任務來說,建議使用線程池。

AsyncTask是一個抽象的泛型類:

public abstract class AsyncTask<Params,Progress,Result>

提供了四個核心方法:

a、onPreExecute(),在主線程中執行,在異步任務執行之前,此方法會被調用,一般可以用於做一些準備工作。

b、doInBackground(Params ... params), 在線程池中執行,此方法用於執行異步任務。可以通過publishProgress方法來更新任務的進度,publishProgress會調用onProgressUpdate方法。此外此方法需要返回結果給onPostExecute方法。

c、onProgressupdate(Progress ...values),在主線程中執行,當後臺任務的執行進度發生改變時此方法會被調用。

d、onPostExecute(Result result),在主線程中執行,在異步任務執行之後,此方法會被調用,其中result參數是後臺任務的返回值,即doInBackground的返回值。

除了上述方法以外,AsyncTask還提供了onCancelled()方法,它同樣在主線程中執行,當異步任務被取消時,onCancelled()方法會被調用,這個時候onPostExecute不會被調用。

註意:

a、AsyncTask的類必須在主線程中加載;

b、AsyncTask的對象必須在主線程中創建;

c、execute方法必須在UI線程調用;

d、一個AsyncTask對象只能執行一次,即只能調用一次execute方法,否則會報運行的異常。

3、HandlerThread

HandlerThread繼承Thread,它是一種可以使用Handler的Thread,它的實現是在run方法中通過Looper.prepare()來創建消息隊列,並通過Looper.loop()來開啟消息循環,這樣在實際的使用中就允許在HandlerThread中創建Handler了。

4、IntentService

IntentService是一種特殊的Service,它繼承了Service並且它是一個抽象類,因此必須創建它的子類才能使用IntentService。

Android的線程和線程池