Android 進程與線程管理

來源:互聯網
上載者:User

標籤:cti   線程建立   run   lis   執行個體變數   函數參數   一個   list   bind   

一、簡介

  進程(Process)是程式的一個啟動並執行執行個體,以區別“程式”這一靜態概念。線程(Thread)是CPU調用的基本單位。

二、進程的組成部分

  在Android中的四大組件是進程組成的一部分,Android App在啟動時,建立App進程,以及主線程(UI線程)和兩個Binder線程。建立一個新工程,在工程中建立一個Activity、Service、BroadcastReceiver,分別在onCreate(...)和onReceiver(...)方法Debug 斷點調試。查看Activity、Service、BroadcastReceiver組件建立及啟動過程。

  啟動應用建立App進程:

 

 

  Activity啟動:

  Service啟動:

  BroadcastReceiver啟動:

 

  由調試可以看到Activity、Service、BroadcastReceiver組件都是在主線程中建立的,其建立過程基本上一致。所以,Service、BroadcastReceiver執行耗時操作時,要在子線程中執行。

三、Runnable、Message、MessageQueue、Looper、Handler

  在Android開發中,使用訊息佇列(message)完成線程間通訊。而使用訊息佇列的線程就是訊息迴圈(message looper)。訊息迴圈不斷的檢查訊息佇列,是否有新訊息。訊息迴圈是由一個線程和一個looper組成;looper對象管理著線程的訊息佇列。

 

  Android的主線程也是一個訊息迴圈,也具有一個Looper,主線程所有的任務都是由looper完成。訊息迴圈是由一個線程和一個looper組成,looper對象管理著線程的訊息佇列;因此,looper不斷的從訊息佇列中抓取訊息,然後完成訊息指定的任務。

 

  PS: 線程預設情況下,是沒有訊息迴圈(Looper)的,在Android中,只有主線程預設就是Looper(訊息迴圈)。在新建立的線程中,使用Looper,要先建立一個Looper才行。

 

  從下面圖中瞭解一下Runnable、Message、MessageQueue、Looper、Handler含義:

 

                (此圖來自於其它書籍資料)

  將這此含義揉合在一起就是一個訊息從發出到執行的整個過程:

              (此圖來自於其它書籍資料)

  從上面這兩個圖中,我們可以瞭解到:

  1. Runnable和Message壓入到MessageQueue中,形成一個訊息集合。

  2. Looper在不斷的迴圈,不停的在做某一件事,比如:中Looper在不停的從MessageQueue中拿出Item,再傳遞給Handler執行。

  3. Handler在不斷的去做某一具體的事情,比如:Handler收到一個訊息,去解析一個後台返回的資料,再將其更新到UI上。

  從上面來看,Handler和Thread從表像上看確實沒有直接的關係,但是因為:

  1.  每個Thread只能對應一個Looper;

  2. 每個Looper只能對應一個MessageQueue;

  3. 每個MessageQueue有N個Message;

  4. 每個Message最多指定一個Handler來處理;

  由此,可以推出Thread和Handler是一對多的關係。而Handler有兩方面作用:

  1. 處理Message,作為Message處理者。

  2. 負責將Message壓入MessageQueue中。

 

四、Message與Handler

 

  Message與Handler是成對出現的,Message是訊息,而Handler是訊息要完成任務的對象。

 

  訊息是Message的一個執行個體,在實現一個訊息時,要同時實現Message類的一些執行個體變數,

 

    • what: 使用者定義的Int類型訊息代碼,用來描述訊息。
    • obj: 隨訊息一起發送的使用者指定的對象,即訊息傳遞的資料。
    • target:完成訊息指定任務的目標,即用來完成訊息指定任務的對象。

 

  Handler是完成訊息或訊息指定任務的對象,Handler不僅是完成訊息的目標或對象,也是建立和發布訊息(Message)的介面。

 

                 (圖來源於Android權威指南)

 

 

 

  • Looper擁有message的訊息佇列,所以,message必須在Looper上發布或讀取。
  • 一個Handler僅一個Looper相關聯,一個Message也僅與一個目標Handler(message目標)相關聯。而Looper擁有訊息的整個隊列。

 

在看看下面這個圖,

 

 

              (圖來源於Android權威指南)

 

從上面這個圖中,可以看出,有多個Handler與一個Looper相關聯,這說明一個Handler的message與另一個Handler的message放於同一個訊息佇列。

 

 五、Handler使用

 

  1. 使用Handler.obtainMessage(...)方法會從公用迴圈訊息佇列中,擷取message。

 

  2. 使用Handler.sendToTarget()方法,會方法訊息發送給與message相關聯的Handler。而Handler會將message放於Looper的訊息佇列尾部。

 

  3. Looper在訊息佇列中,擷取到特定的訊息後,將其發送給訊息目標(與之相關聯的Handler)去處理。訊息一般在Handler(訊息目標)的handlerMessage(...)實現方法處理訊息指定要完成的任務。一般,要繼承Handler基類,覆蓋handlerMessage()方法。

 

 六、傳遞Handler

 

  Handler類的一個執行個體,可以作為函數參數,傳遞給其它子線程。

 

  主線程擁有一個Handler和Looper訊息迴圈,線上程中,主線程上建立一個Handler,會自動與主線程的Looper相關聯。將主線程建立的Handler傳遞給另一個子線程,傳遞出去的Handler始終會與建立它的線程的Looper保持聯絡。因此,任何已傳出的Handler負責處理的訊息,都將在主線程的訊息佇列中處理。

 

  那麼,就可以通過這種方式,在子線程中,去更新主線程的事件,資料,或者UI。

 

七、在新線程中,建立Looper(訊息迴圈)

 

  在主線程中不用建立Looper是因為App啟動時,建立主線程中預設建立了Looper,並且一個線程中,只能有一個Looper。存在多個系統會報錯。

 

  Looper為什麼不會堵塞主線程,提示ANR(application not responding)?

 

  因為,主線程中的Activity和所有事件都是通過Looper執行的。Looper有一個訊息佇列,在不斷的接收事件訊息和執行事件。此中的堵塞是指Looper迴圈不被堵塞,而非Looper堵塞線程。

 

Android 進程與線程管理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.