Android-Looper類
轉自http://vinny-w.iteye.com/blog/1334641
Android中的Looper類,是用來封裝訊息迴圈和訊息佇列的一個類,用於在android執行緒中進行訊息處理。handler其實可以看做是一個工具類,用來向訊息佇列中插入訊息的。
(1) Looper類用來為一個執行緒開啟一個訊息迴圈。
預設情況下android中新誕生的執行緒是沒有開啟訊息迴圈的。(主執行緒除外,主執行緒系統會自動為其建立Looper物件,開啟訊息迴圈。)
Looper物件通過MessageQueue來存放訊息和事件。一個執行緒只能有一個Looper,對應一個MessageQueue。
(2) 通常是通過Handler物件來與Looper進行互動的。Handler可看做是Looper的一個介面,用來向指定的Looper傳送訊息及定義處理方法。
預設情況下Handler會與其被定義時所線上程的Looper繫結,比如,Handler在主執行緒中定義,那麼它是與主執行緒的Looper繫結。
mainHandler = new Handler() 等價於new Handler(Looper.myLooper()).
Looper.myLooper():獲取當前程式的looper物件,類似的 Looper.getMainLooper() 用於獲取主執行緒的Looper物件。
(3) 在非主執行緒中直接new Handler() 會報如下的錯誤:
E/AndroidRuntime( 6173): Uncaught handler: thread Thread-8 exiting due to uncaught exception
E/AndroidRuntime( 6173): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
原因是非主執行緒中預設沒有建立Looper物件,需要先呼叫Looper.prepare()啟用Looper。
(4) Looper.loop(); 讓Looper開始工作,從訊息佇列裡取訊息,處理訊息。
注意:寫在Looper.loop()之後的程式碼不會被執行,這個函式內部應該是一個迴圈,當呼叫mHandler.getLooper().quit()後,loop才會中止,其後的程式碼才能得以執行。
(5) 基於以上知識,可實現主執行緒給子執行緒(非主執行緒)傳送訊息。
把下面例子中的mHandler宣告成類成員,在主執行緒通過mHandler傳送訊息即可。
Android官方文件中Looper的介紹:
Class used to run a message loop for a thread. Threads by default do not have a message loop associated with them; to create one, call prepare() in the thread that is to run the loop, and then loop() to have it process messages until the loop is stopped.
Most interaction with a message loop is through the Handler class.
This is a typical example of the implementation of a Looper thread, using the separation of prepare() and loop() to create an initial Handler to communicate with the Looper.
- 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();
- }
- }
相關文章
- IP地址分類(A類 B類 C類 D類 E類)
- 【java】Maths類、Random類、System類、BigInteger類、BigDecimal類、Date類、SimpleDateFormat類JavarandomDecimalORM
- Scanner類、Random類、ArrayList類random
- Java的特殊類用法:檔案類、內部類、本地類、匿名類Java
- JAVA集合類簡要筆記 - 內部類 包裝類 Object類 String類 BigDecimal類 system類Java筆記ObjectDecimal
- C# 繼承 子類(派生類) 父類(基類)C#繼承
- DriveInfo類,Path類
- Java常用類-Object類JavaObject
- 分類 和 聚類聚類
- JAVA常用類--Cleaner類Java
- 類的繼承_子類繼承父類繼承
- SQLAlchemy Table(表)類方式 – Table類和Column類SQL
- 獲取類屬性值,當前類,父類
- 泛型類派生子類泛型
- python 類的子類Python
- python類的子類Python
- Java —— 列舉類(enum 類)Java
- Java —— 檔案類(File 類)Java
- Java —— 集合工具類(Collections 類)Java
- 類與類的載入
- JAVA常用類--Runtime類Java
- Java超類與子類Java
- BigInter類和Decimallei類Decimal
- java語言邏輯類、引數類和字元類Java字元
- [原創]介面、類、抽象類、物件的另類解釋抽象物件
- 京東獲得jd商品分類API介面(父分類、根分類、子分類)API
- python建立類和類方法Python
- Java類與匿名內部類Java
- 併發工具類(五) Phaser類
- 陣列,陣列類,SyStem類陣列
- 何時使用static類(工具類)
- Java中常用類之Object類JavaObject
- 繼承 基類與派生類繼承
- 章13——包裝類——Math類
- ML.NET 示例:多類分類之問題分類
- ML.NET 示例:多類分類之鳶尾花分類
- 14.Java-Arrays(類)、基本型別包裝類、Integer(類)Java型別
- 深入理解java巢狀類和內部類、匿名類Java巢狀