1. 程式人生 > >Looper.loop() android執行緒中的訊息迴圈

Looper.loop() android執行緒中的訊息迴圈

Looper用於封裝了android執行緒中的訊息迴圈,預設情況下一個執行緒是不存在訊息迴圈(message loop)的,需要呼叫Looper.prepare()來給執行緒建立一個訊息迴圈,呼叫Looper.loop()來使訊息迴圈起作用,從訊息佇列裡取訊息,處理訊息。

注:寫在Looper.loop()之後的程式碼不會被立即執行,當呼叫後mHandler.getLooper().quit()後,loop才會中止,其後的程式碼才能得以執行。Looper物件通過MessageQueue來存放訊息和事件。一個執行緒只能有一個Looper,對應一個MessageQueue。


以下是Android API中的一個典型的Looper thread實現:

//Handler不帶引數的預設建構函式:new Handler(),實際上是通過Looper.myLooper()來獲取當前執行緒中的訊息迴圈,
//而預設情況下,執行緒是沒有訊息迴圈的,所以要呼叫 Looper.prepare()來給執行緒建立訊息迴圈,然後再通過,Looper.loop()來使訊息迴圈起作用。


class LooperThread extends Thread
{
public Handler mHandler;
public void run()
{
Looper.prepare();
mHandler = new Handler()
{
public void handleMessage(Message msg)
{
// process incoming messages here
}
};
Looper.loop();
}


另,Activity的MainUI執行緒預設是有訊息佇列的。所以在Activity中新建Handler時,不需要先呼叫Looper.prepare()。

當你的執行緒想擁有自己的MessageQueue的時候先Looper.prepare(),然後Looper.loop();
參照原始碼:
public static final void prepare() {   
       if (sThreadLocal.get() != null) {   
           throw new RuntimeException("Only one Looper may be created per thread");   
       }   
       sThreadLocal.set(new Looper());   
   }   
這段程式碼就是通過ThreadLocal來產生一個Looper物件做為執行緒區域性變數,然後呼叫Looper.loop()則是取出Looper物件中的MessageQueue進行訊息迴圈了,這樣形成了這個執行緒的訊息佇列。
一般情況下只會有主執行緒會呼叫prepare方法(ActivityThread的main函式)。

使執行緒擁有自己的訊息列隊,主執行緒擁有自己的訊息列隊,一般執行緒建立時沒有自己的訊息列隊,訊息處理時就在主執行緒中完成,如果執行緒中使用Looper.prepare()和Looper.loop()建立了訊息佇列就可以讓訊息處理在該執行緒中完成

相關推薦

Looper.loop() android執行訊息迴圈

Looper用於封裝了android執行緒中的訊息迴圈,預設情況下一個執行緒是不存在訊息迴圈(message loop)的,需要呼叫Looper.prepare()來給執行緒建立一個訊息迴圈,呼叫Looper.loop()來使訊息迴圈起作用,從訊息佇列裡取訊息,處理訊息。

Looper.loop() android執行訊息迴圈

Looper用於封裝了android執行緒中的訊息迴圈,預設情況下一個執行緒是不存在訊息迴圈(message loop)的,需要呼叫Looper.prepare()來給執行緒建立一個訊息迴圈,呼叫Looper.loop()來使訊息迴圈起作用,從訊息佇列裡取訊息,處理訊息。

Android執行執行“getevent”命令時的執行退出(結束)問題

       專案中遇到需要執行shell命令“getevent”獲取座標引數的需求,但是發現無法結束執行該命令的執行緒,後來終於發現解決方法。在此記錄下。        我線上程中通過Process

執行之--- 訊息迴圈

    上圖顯示了run loop 的概念結構以及各種源。輸入源傳遞非同步訊息給相應的處理例程,並呼叫runUntilDate:方法來退出(線上程裡面相關的NSRunLoop 物件呼叫)。定時源則直接傳遞訊息給處理例程,但並不會退出run loop;         實踐: self.socke

Android面試:主執行Looper.loop()一直無限迴圈為什麼不會造成ANR?(轉)

  引子: 正如我們所知,在android中如果主執行緒中進行耗時操作會引發ANR(Application Not Responding)異常。 造成ANR的原因一般有兩種: 只有當應用程式的UI執行緒響應超時才會引起ANR,超時產生原因一般有兩種 1. 當前的事件沒有機會

android執行Looper.loop()為什麼不會造成程式ANR

程式入口為ActivityThread的main方法,原始碼如下: frameworks/base/core/java/android/app/ActivityThread.java public static void main(String[] args) { S

執行Looper.loop()一直無限迴圈為什麼不會造成ANR?

引子: 正如我們所知,在android中如果主執行緒中進行耗時操作會引發ANR(Application Not Responding)異常。 造成ANR的原因一般有兩種: 當前的事件沒有機會得到處理(即主執行緒正在處理前一個事件,沒有及時的完成或者looper被某種原因阻塞住了)當前的事件正在處理,但沒有

Android訊息機制,用Android執行間通訊的Message機制,AndroidHandler的使用方法

轉自:http://www.cnblogs.com/-OYK/archive/2011/08/03/2126657.html Android的訊息機制(一)   android 有一種叫訊息佇列的說法,這裡我們可以這樣理解:假如一個隧道就是一個訊息佇列,那麼裡

Android 執行訊息迴圈

我們知道,Android應用程式是通過訊息來驅動的,即在應用程式的主執行緒(UI執行緒)中有一個訊息迴圈,負責處理訊息佇列中的訊息。我們也知道,Android應用程式是支援多執行緒的,即可以建立子執行緒來執行一些計算型的任務,那麼,這些子執行緒能不能像應用程式的主執行緒一樣

Android 執行訊息迴圈機制

android.os.Looper: Looper用於封裝了android執行緒中的訊息迴圈,預設情況下一個執行緒是不存在訊息迴圈(message loop)的,需要呼叫Looper.prepare()來給執行緒建立一個訊息迴圈,呼叫Looper.loop()來使訊息迴

Android訊息機制原理,仿寫Handler Looper原始碼跨執行通訊原理--之執行間通訊原理(一)

前言:我們都知道Android的執行緒通訊是用Handler、Looper機制實現的,面試也經常問道,網上也有很多文章介紹原始碼但是可能很多小白只是機械是的記憶,回答不清楚原理究竟是怎麼回事。下邊我將一步一步仿寫一個Handler、Looper模擬Android的執行緒間通訊

Android 執行 Looper.prepare()、Looper.loop() 使用

優化專案過程中發現了一個很Low的問題,整理一下,備忘: 說問題之前先看下HandlerThread的定義 一個封裝了looper的執行緒:   Looper用於封裝了android執

Looper.prepare()和Looper.loop(),在子執行更新UI

當子執行緒想直接更新UI時,例如進行Toast提示。 可以先Looper.prepare(),然後Looper.loop(),程式碼如下(加黑處): public class CrashHandler implements UncaughtExceptionHandler

執行新增訊息迴圈

UINT ThreadFunc(LPVOID lpParam) //執行緒函式 { int bRet = 0; MSG msg; while(true) { if ((bRet = PeekMessage(&a

Android執行的Handler機制、Looper的介紹與整理

在多執行緒的開發中,Handler機制如同在主執行緒中執行一樣,只是需要注意在非主執行緒中Handler機制的使用限制,本文將對這些內容作出解釋。 如果在子執行緒中對上UI介面進行操作,將丟擲異常。為此,Android中引入了Handler訊息  傳遞機制,來實現在子建

Android 執行 Looper.prepare()、Looper.loop()

注:寫在Looper.loop()之後的程式碼不會被立即執行,當呼叫後mHandler.getLooper().quit()後,loop才會中止,其後的程式碼才能得以執行。Looper物件通過MessageQueue來存放訊息和事件。一個執行緒只能有一個Looper,對應一個MessageQueue。 以下

關於主執行自動建立的Looper的思考:主執行Looper的輪詢死迴圈為何沒有阻塞主執行

Android中UI執行緒會自動給我們建立一個looper,但是looper中的loop方法是個死迴圈.為什麼我們在UI執行緒中寫的程式碼為何都能順利執行?為什麼沒有引起ANR呢? Looper的部分原始碼: /** * Initial

Looper機制:主執行利用handler向工作執行傳送訊息

注意:由主執行緒向非UI執行緒中傳送訊息的時候,非UI執行緒需要先新增訊息佇列,然後處理訊息迴圈。 (1).預設情況下android中新誕生的執行緒是沒有開啟訊息迴圈的。(主執行緒除外,主執行緒系統會自動為其建立Looper物件,開啟訊息迴圈。)

Android執行模型--在子執行更新UI

       Android是支援多執行緒的。主執行緒也稱UI執行緒,子執行緒也稱工作執行緒。一般耗時操作在子執行緒中進行,更新UI操作在主執行緒中進行。在主執行緒中執行耗時操作容易發生ANR錯誤,即應用程式無響應。而Android中又規定只有建立UI的執行緒

Android執行向子執行傳送資訊

主要用到了Handler類,Looper類和Message類 先介紹下這幾個類 Looper類,是用來為一個執行緒開啟一個訊息佇列,預設情況下Android下新開啟的執行緒沒有開啟訊息佇列的,除了主執行緒外,主執行緒系統會預設為其開啟一個訊息佇列;looper是通過MessageQueu