【Android开发】线程与消息处理-Handler消息传递机制之Looper
生活随笔
收集整理的這篇文章主要介紹了
【Android开发】线程与消息处理-Handler消息传递机制之Looper
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在前面已經介紹了在Android中如何創建、開啟、休眠和中斷線程。不過,此時并沒有在新創建的子線程中對UI界面上的內容進行操作,如果應用前面介紹的方法對UI界面進行操作,將拋出異常。
為此,Android中引入了Handler消息傳遞機制,來實現在新創建的線程中操作UI界面。下面將對Handler消息傳遞機制進行介紹。
1.循環者Looper介紹
在介紹Looper之前,需要先了解一下MessageQueue的概念。在Android中,一個線程對應一個Looper對象,而一個Looper對象又對應一個MessageQueue(消息隊列)。MessageQueue用于存放Message(消息),在MessageQueue中,存放的消息按照FIFO(先進先出)原則執行,由于MessageQueue被封裝到Looper里面,所以這里不對MessageQueue進行過多介紹。
Looper對象用來為一個線程開啟一個循環消息,從而操作MessageQueue。默認情況下,Android中新創建的線程時沒有開啟消息循環的,但是主線程除外。系統自動為主線程創建Looper對象,開啟消息循環。所以,當在主線程中應用下面的代碼創建Handler對象時不會出錯,而如果在新創建的非主線程中創建Handler對象,將產生java.lang.RuntimeException:Can't create handle inside thread that has not called Looper.prepare()的異常信息。
Handler handler2=new Handler();
如果想要在非主線程中創建Handler對象,首先需要使用Looper類的prepare()方法來初始化一個Looper對象,然后創建該Handler對象,再使用Looper類的loop()方法啟動Looper,從消息隊列中獲取和處理消息。
實例:創建一個繼承Thread類的LooperThread,并在重寫的run()方法中創建一個Handler對象,發送并處理消息。
package com.example.test; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.util.Log;public class MainActivity extends Activity{ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);LooperThread thread=new LooperThread();//創建一個線程thread.start();//開啟一個新線程}public class LooperThread extends Thread{public Handler handler1;@Overridepublic void run() {super.run();Looper.prepare();//初始化一個Looper對象//實例化一個Handler對象handler1=new Handler(){@Overridepublic void handleMessage(Message msg) {Log.i("Looper",String.valueOf(msg.what));}};Message m=handler1.obtainMessage();//獲取一個消息m.what=0x11;//設置Message的what屬性的值handler1.sendMessage(m);//發送消息Looper.loop();//啟動Looper}}}
Looper類常用的方法如表所示:
prepare()用于初始化Looper
loop()啟動Looper線程,線程會從消息隊列里獲取和處理消息。
myLooper()可以獲取當前線程的Looper對象
getThread()用于獲取Looper對象所屬的線程
quit()用于結束Looper循環
為此,Android中引入了Handler消息傳遞機制,來實現在新創建的線程中操作UI界面。下面將對Handler消息傳遞機制進行介紹。
1.循環者Looper介紹
在介紹Looper之前,需要先了解一下MessageQueue的概念。在Android中,一個線程對應一個Looper對象,而一個Looper對象又對應一個MessageQueue(消息隊列)。MessageQueue用于存放Message(消息),在MessageQueue中,存放的消息按照FIFO(先進先出)原則執行,由于MessageQueue被封裝到Looper里面,所以這里不對MessageQueue進行過多介紹。
Looper對象用來為一個線程開啟一個循環消息,從而操作MessageQueue。默認情況下,Android中新創建的線程時沒有開啟消息循環的,但是主線程除外。系統自動為主線程創建Looper對象,開啟消息循環。所以,當在主線程中應用下面的代碼創建Handler對象時不會出錯,而如果在新創建的非主線程中創建Handler對象,將產生java.lang.RuntimeException:Can't create handle inside thread that has not called Looper.prepare()的異常信息。
Handler handler2=new Handler();
如果想要在非主線程中創建Handler對象,首先需要使用Looper類的prepare()方法來初始化一個Looper對象,然后創建該Handler對象,再使用Looper類的loop()方法啟動Looper,從消息隊列中獲取和處理消息。
實例:創建一個繼承Thread類的LooperThread,并在重寫的run()方法中創建一個Handler對象,發送并處理消息。
package com.example.test; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.util.Log;public class MainActivity extends Activity{ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);LooperThread thread=new LooperThread();//創建一個線程thread.start();//開啟一個新線程}public class LooperThread extends Thread{public Handler handler1;@Overridepublic void run() {super.run();Looper.prepare();//初始化一個Looper對象//實例化一個Handler對象handler1=new Handler(){@Overridepublic void handleMessage(Message msg) {Log.i("Looper",String.valueOf(msg.what));}};Message m=handler1.obtainMessage();//獲取一個消息m.what=0x11;//設置Message的what屬性的值handler1.sendMessage(m);//發送消息Looper.loop();//啟動Looper}}}
運行實例,在日志面板(LogCat)上輸出如圖中所示的內容
Looper類常用的方法如表所示:
prepare()用于初始化Looper
loop()啟動Looper線程,線程會從消息隊列里獲取和處理消息。
myLooper()可以獲取當前線程的Looper對象
getThread()用于獲取Looper對象所屬的線程
quit()用于結束Looper循環
*注意Looper.loop()之后的代碼不會被執行,因為該函數內部是一個循環。只有調用Handler.getLooper.quit()方法之后,loop()方法才會終止,其后面的代碼才能運行。
轉載請注明出處:http://blog.csdn.net/acmman/article/details/46352863
總結
以上是生活随笔為你收集整理的【Android开发】线程与消息处理-Handler消息传递机制之Looper的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 查看selenium python的ap
- 下一篇: 2014年Spark亚太峰会参与回忆录