Android沿用了JAVA的線程模型,其中的線程分為主線程和子線程,其中主線程又叫UI線程。在Android系統中,在默認情況下,一個應用程式內的各個組件(如Activity、BroadcastReceiver、Service)都會在同一個進程(Process)裡執行,且由此進程的主線程負責執行。如果有特別指定(通過android:process),也可以讓特定組件在不同的進程中運行。無論組件在哪一個進程中運行,默認情況下,他們都由此進程的主線程負責執行。主線程既要處理Activity組件的UI事件,又要處理Service後臺服務工作,通常會忙不過來。為了解決此問題,主線程可以創建多個子線程來處理後臺服務工作,而本身專心處理UI畫面的事件。子線程的任務則是執行耗時任務,比如網絡請求,I/O操作等。
Android中的子線程
Android中開啟一個子線程,有以下兩種方法:第一種是類繼承Thread重寫run方法,第二種是實習Runnable接口並重寫run方法。
1:繼承Thread類
public class MyThread extendsThread {
public void run(){
}
}
newMyThread().start();
2:實現Runnable接口
public class MyRunnable implementsRunnable{
@Override
public void run(){
}
}
new MyThread().start();
Android提供了好幾種方法讓其他線程操作UI控制項:
Activity.runOnUiThread(Runnable)、View.post(Runnable)、Handler。
這些類或方法代碼比較複雜,因此Android提供了一個名為AsyncTask的輔助類來簡化多線程代碼。
AsyncTask
AsyncTask是一個輕量級的異步任務類,它可以在線程池中執行後臺任務,然後把執行的進度和結果傳遞給主線程並且在主線程中更新UI。AsyncTask適用於簡單的異步處理,不需要藉助線程和Handler即可實現。
AsyncTask是抽象類,定義了三種泛型類型Params,Progress和Result。
(1).Params啟動任務執行的輸入參數,比如HTTP請求的URL。
(2).Progress後臺任務執行的百分比。
(3).Result後臺執行任務最終返回的結果,比如String。
AsyncTask後臺線程與UI線程的交互如下圖:
AsyncTask後臺線程與UI線程的交互
(1).onPreExecute(),該方法將在執行實際的後臺操作前被UI thread調用。
(2).doInBackground(Params...),將在onPreExecute方法執行後馬上執行,該方法運行在後臺線程中,這裡將主要負責執行那些很耗時的後臺計算工作。
(3).onProgressUpdate(Progress...),在publishProgress方法被調用後,UI thread將調用這個方法從而在界面上展示任務的進展情況。
(4).onPostExecute(Result),在doInBackground執行完成後,onPostExecute 方法將被UI thread調用,後臺的計算結果將通過該方法傳遞到UI thread。