當前位置:首頁 » 安卓系統 » android消息隊列

android消息隊列

發布時間: 2022-03-12 07:55:12

1. android什麼樣的消息屬於非同步消息

非同步消息和線程的區別在於,線程執行完run()方法後,線程就結束了,而非同步消息是在線程內部有一個消息隊列,寫一個死循環,
一直去消息隊列里去取消息,然後根據消息類型處理相應的操作,如果取不到消息就一直在等待。

非同步認為一般用於:任務需要常駐,比如處理用戶交互的屏幕觸摸事件處理;根據不同的消息類型處理不同的操作。

實現上就是:
1.每個非同步任務要有一個消息隊列;
2使用while(true)無限循環,讀取消息,處理消息,執行回調函數等;
3,外部可以向隊列發消息,消息隊列注意線程安全。

2. android中主線程會創建消息隊列嗎

一、Handler的定義: Handler主要接收子線程發送的數據, 並用此數據配合主線程更新UI,用來跟UI主線程交互用。比如可以用handler發送一個message,然後在handler的線程中來接收、處理該消息,以避免直接在UI主線程中處理事務導致影響UI主線程的其他處理工作,Android提供了Handler作為主線程和子線程的紐帶;也可以將handler對象傳給其他進程,以便在其他進程中通過handler給你發送事件;還可以通過handler的延時發送message,可以延時處理一些事務的處理。 通常情況下,當應用程序啟動時,Android首先會開啟一個主線程 (也就是UI線程) , 主線程為管理界面中的UI控制項,進行事件分發。如果此時需要一個耗時的操作,例如:聯網讀取數據,或者讀取本地較大的一個文件的時候,你不能把這些操作放在主線程中,如果你放在主線程中的話,界面會出現假死現象,如果5秒鍾還沒有完成的話,會收到Android系統的一個錯誤提示"強制關閉". 這個時候我們需要把這些耗時的操作,放在一個子線程中,因為子線程涉及到UI更新,但是當子線程中有涉及到操作UI的操作時,就會對主線程產生危險,也就是說,更新UI只能在主線程中更新,在子線程中操作是危險的. 這個時候,Handler就出現了來解決這個復雜的問題,由於Handler運行在主線程中(UI線程中),它與子線程可以通過Message對象來傳遞數據,這個時候,Handler就承擔著接受子線程傳過來的(子線程用sedMessage()方法傳遞)Message對象,(裡麵包含數據), 把這些消息放入主線程隊列中,配合主線程進行更新UI。 二、Handler一些特點 handler可以分發Message對象和Runnable對象到主線程中, 每個Handler實例,都會綁定到創建他的線程中(一般是位於主線程), 也就是說Handler對象初始化後,就默認與對它初始化的進程的消息隊列綁定,因此可以利用Handler所包含的消息隊列,制定一些操作的順序。 三、Handler中分發消息的一些方法 post(Runnable) postAtTime(Runnable,long) postDelayed(Runnable long) post類方法允許你排列一個Runnable對象到主線程隊列中 sendEmptyMessage(int) sendMessage(Message) sendMessageAtTime(Message,long) sendMessageDelayed(Message,long) sendMessage類方法, 允許你安排一個帶數據的Message對象到隊列中,等待更新. 四、應用實例: 1,傳遞Message。用於接受子線程發送的數據, 並用此數據配合主線程更新UI。 在Android中,對於UI的操作通常需要放在主線程中進行操作。如果在子線程中有關於UI的操作,那麼就需要把數據消息作為一個Message對象發送到消息隊列中,然後,用Handler中的handlerMessge方法處理傳過來的數據信息,並操作UI。類sendMessage(Message msg)方法實現發送消息的操作。 在初始化Handler對象時重寫的handleMessage方法來接收Messgae並進行相關操作。 2,傳遞Runnable對象。用於通過Handler綁定的消息隊列,安排不同操作的執行順序。 Handler對象在進行初始化的時候,會默認的自動綁定消息隊列。利用類post方法,可以將Runnable對象發送到消息隊列中,按照隊列的機制按順序執行不同的Runnable對象中的run方法。 另外,Android的CPU分配的最小單元是線程,Handler一般是在某個線程里創建的,因而Handler和Thread就是相互綁定的,一一對應。而Runnable是一個介面,Thread是Runnable的子類。所以說,他倆都算一個進程。 視頻教程中的例子: 1. public class HandlerActivity extends Activity { 2. 3. //聲明兩個按鈕控制項 4. private Button startButton = null; 5. private Button endButton = null; 6. @Override 7. public void onCreate(Bundle savedInstanceState) { 8. super.onCreate(savedInstanceState); 9. setContentView(R.layout.main); 10. //根據控制項的ID得到代表控制項的對象,並為這兩個按鈕設置相應的監聽器 11. startButton = (Button)findViewById(R.id.startButton); 12. startButton.setOnClickListener(new StartButtonListener()); 13. endButton = (Button)findViewById(R.id.endButton); 14. endButton.setOnClickListener(new EndButtonListener()); 15. 16. } 17. class StartButtonListener implements OnClickListener{ 18. 19. @Override 20. public void onClick(View v) { 21. //調用Handler的post方法,將要執行的線程對象添加到隊列當中 22. handler.post(updateThread); 23. } 24. 25. } 26. 27. class EndButtonListener implements OnClickListener{ 28. 29. @Override 30. public void onClick(View v) { 31. handler.removeCallbacks(updateThread); 32. } 33. 34. } 35. //創建一個Handler對象 36. Handler handler = new Handler(); 37. //將要執行的操作寫在線程對象的run方法當中 38. Runnable updateThread = new Runnable(){ 39. 40. @Override 41. public void run() { 42. System.out.println("UpdateThread"); 43. //在run方法內部,執行postDelayed或者是post方法 44. handler.postDelayed(updateThread, 3000); 45. } 46. 47. }; 48. } 程序的運行結果就是每隔3秒鍾,就會在控制台列印一行UpdateTread。這是因為實現了Runnable介面的updateThread對象進入了空的消息隊列即被立即執行run方法,而在run方法的內部,又在3000ms之後將其再次發送進入消息隊列中。 3, Handler和多線程 post方法雖然發送的是一個實現了Runnable介面的類對象,但是它並非創建了一個新線程,而是執行了該對象中的run方法。也就是說,整個run中的操作和主線程處於同一個線程。 這樣對於那些簡單的操作,似乎並不會影響。但是對於耗時較長的操作,就會出現「假死」。為了解決這個問題,就需要使得handler綁定到一個新開啟線程的消息隊列上,在這個處於另外線程的上的消息隊列中處理傳過來的Runnable對象和消息。 1. public class HandlerTest2 extends Activity { 2. 3. @Override 4. protected void onCreate(Bundle savedInstanceState) { 5. // TODO Auto-generated method stub 6. super.onCreate(savedInstanceState); 7. setContentView(R.layout.main); 8. //列印了當前線程的ID 9. System.out.println("Activity-->" + Thread.currentThread().getId()); 10. //生成一個HandlerThread對象 11. HandlerThread handlerThread = new HandlerThread("handler_thread"); 12. //在使用HandlerThread的getLooper()方法之前,必須先調用該類的start(),同時開啟一個新線程; 13. handlerThread.start(); 14. //將由HandlerThread獲取的Looper傳遞給Handler對象,即由處於另外線程的Looper代替handler初始化時默認綁定的消息隊列來處理消息。 15. // HandlerThread顧名思義就是可以處理消息循環的線程,它是一個擁有Looper的線程 16. ,可以處理消息循環; 其實與其說Handler和一個線程綁定,倒不如說Handler和Looper是 17. 一一對應的。 18. MyHandler myHandler = new MyHandler(handlerThread.getLooper()); 19. Message msg = myHandler.obtainMessage(); 20. //將msg發送到目標對象,所謂的目標對象,就是生成該msg對象的handler對象 21. Bundle b = new Bundle(); 22. b.putInt("age", 20); 23. b.putString("name", "Jhon"); 24. msg.setData(b); 25. msg.sendToTarget(); //將msg發送到myHandler 26. } 27. 28. //定義類 29. class MyHandler extends Handler{ 30. public MyHandler(){ 31. 32. } 33. 34. public MyHandler(Looper looper){ 35. super(looper); 36. } 37. @Override 38. public void handleMessage(Message msg) { 39. Bundle b = msg.getData(); 40. int age = b.getInt("age"); 41. String name = b.getString("name"); 42. System.out.println("age is " + age + ", name is" + name); 43. System.out.println("Handler--->" + Thread.currentThread().getId()); 44. System.out.println("handlerMessage"); 45. } 46. } 47. } 這樣,當使用sendMessage方法傳遞消息或者使用post方法傳遞Runnable對象時,就會把它們傳遞到與handler對象綁定的處於另外一個線程的消息隊列中,它們將在另外的消息隊列中被處理。而主線程還會在發送操作完成時候繼續進行,不會影響當前的操作。 這里需要注意,這里用到的多線程並非由Runnable對象開啟的,而是ThreadHandler對象開啟的。Runnable對象只是作為一個封裝了操作的對象被傳遞,並未產生新線程。 另外再強調一遍,在UI線程(主線程)中: mHandler=new Handler(); mHandler.post(new Runnable(){ void run(){ //執行代碼.. } }); 這個線程其實是在UI線程之內運行的,並沒有新建線程。 常見的新建線程的方法是: Thread thread = new Thread(); thread.start(); HandlerThread thread = new HandlerThread("string"); thread.start();

3. android怎樣編寫延時消息隊列

最早的時候我下過一個2005EE版,怎麼也安裝不上,後來發現原來是EE不支持xp =_= , 然後就下 .... 本機沒有安裝過消息隊列,找出系統盤安裝消息隊列組件,在組件安裝中

4. android handler中 messagequeue和looper都什麼啥時候創建

說吧handler消息隊列其Message newhandler候同攜帶Message象需要傳遞信息候直接拿ok同建議看啊Handler 機制原理 (給列舉算): andriod提供 Handler Looper 滿足線程間通信Handler 先進先原則Looper類用管理特定線程內象間消息交換(Message Exchange) 1)Looper: 線程產Looper象由管理線程Message Queue(消息隊列) 2)Handler: 構造Handler象與Looper溝通便push新消息Message Queue;或者接收LooperMessage Queue取)所送消息 3) Message Queue(消息隊列):用存放線程放入消息 4)線程:UI thread 通main threadAndroid啟程序替建立Message Queue

5. android里的所有事件都是基於消息隊列的嗎

Android廣播分為兩個方面:廣播發送者和廣播接收者,通常情況下,BroadcastReceiver指的就是廣播接收者(廣播接收器)。廣播作為Android組件間的通信方式,可以使用的場景如下:1.同一app內部的同一組件內的消息通信(單個或多個線程之間)。2.同一app內部的不同組件之間的消息通信(單個進程)。3.同一app具有多個進程的不同組件之間的消息通信。4.不同app之間的組件之間消息通信。5.Android系統在特定情況下與App之間的消息通信。從實現原理看上,Android中的廣播使用了觀察者模式,基於消息的發布/訂閱事件模型。因此,從實現的角度來看,Android中的廣播將廣播的發送者和接受者極大程度上解耦,使得系統能夠方便集成,更易擴展。具體實現流程要點粗略概括如下:1.廣播接收者BroadcastReceiver通過Binder機制向AMS(Activity Manager Service)進行注冊;2.廣播發送者通過binder機制向AMS發送廣播;3.AMS查找符合相應條件(IntentFilter/Permission等)的BroadcastReceiver,將廣播發送到BroadcastReceiver(一般情況下是Activity)相應的消息循環隊列中;4.消息循環執行拿到此廣播,回調BroadcastReceiver中的onReceive()方法。 對於不同的廣播類型,以及不同的BroadcastReceiver注冊方式,具體實現上會有不同。但總體流程大致如上。

6. Andriod是不是每個線程都有消息隊列

你好
很高興為你解答

答案是:
熟悉Windows編程的朋友可能知道Windows程序是消息驅動的,並且有全局的消息循環系統。而Android應用程序也是消息驅動的,按道 理來說也應該提供消息循環機制。實際上谷歌參考了Windows的消息循環機制,也在Android系統中實現了消息循環機制。Android通過 Looper、Handler來實現消息循環機制,Android消息循環是針對線程的(每個線程都可以有自己的消息隊列和消息循環)。本文深入介紹一下 Android消息處理系統原理。
前面提到Android系統的消息隊列和消息循環都是針對具體線程的,一個線程可以存在(當然也可以不存在)一個消息隊列和一個消息循環 (Looper),特定線程的消息只能分發給本線程,不能進行跨線程,跨進程通訊。但是創建的工作線程默認是沒有消息循環和消息隊列的,如果想讓該線程具 有消息隊列和消息循環,需要在線程中首先調用Looper.prepare()來創建消息隊列,然後調用Looper.loop()進入消息循環。

滿意請採納,謝謝

7. 如何抓取廣播隊列消息 android

下面和大家分享一下android中非常重要的消息處理機制,說到消息處理,Message,MessageQueue,Looper,Handler這四個類的作用是我們必須要明白的。 下面分別談談他們的作用: MessageQueue MessageQueue表示消息隊列,存放消息的地方,按照「先進先..則執行,每一個線程只可以擁有一個MessageQueue。當創建Looper對象的時候會創建一個MessageQueue對象。

Message

Message表示消息對象,MessageQueue中存放的對象,一個MessageQueue中可以存放多個Message對象。通過調用Message類的obtain()方法或者調用Handler類的obtainMessage()方法獲取Message對象,但是這樣並不一定會創建一個新的Message對象,如果消息池中有可用的Message對象則直接取出返回這個對象,否則如果消息池中沒有可用的Message對象,則會創建一個新的Message對象。當消息隊列中的Message對象被系統處理完之後,該Message對象會從MessageQueue中刪除,然後放入消息池中。

Looper

Looper是用來操作MessageQueue的,每一個Looper對應一個MessageQueue,可以通過調用Looper.myLooper()方法獲取當前線程的Looper對象,Looper循環從MessageQueue中取出Message對象,交給Handler調用handleMessage方法進行處理,處理完之後Message對象被放入消息池中。

Handler

Handler是消息的處理者,Handler將需要傳遞的信息封裝成Message對象,然後調用sendMessage方法將Message放入MessageQueue中,當MessageQueue循環到該Message時,調用相應Handler對象的handleMessage方法對其進行處理。 http://d-android.com/developer/
注意在UI線程也就是主線程中默認會創建Looper對象和MessageQueue對象,如果在我們自己新開的線程中要進行消息處理,必須創建Looper對象和MessageQueue對象,通過調用Looper.prepare()方法可以創建Looper對象和MessageQueue對象,調用Looper.loop()方法可以啟動消息循環隊列。

8. Java/Android:關於ActiveMQ與MQTT的關系是什麼

實在看不下去了,網上怎麼竟是些胡說八道的呢。太坑人。MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸)是IBM開發的一個即時通訊協議,activemq只是apache下一個隊列項目,不僅僅支持MQTT協議,也支持其他比如AMQP等協議。MQTT是協議,協議只是定義好的規則,比如文檔也是協議。activemq只是實現了MQTT協議的一個程序

9. android 中,怎麼清除一個Handler里的所有消息隊列有什麼方法么

final void removeMessages(int what)
Remove any pending posts of messages with code 'what' that are in the message queue.
這個是我看API裡面的一個方法。看解釋應該是異常指定標識what對應的那個消息msg。。希望對你有幫助

10. 引起android 消息隊列堵塞的原因有哪些

耗時的工作放在了主線程
無限循環

熱點內容
jquery獲取上傳文件 發布:2025-05-14 20:27:57 瀏覽:42
雲web伺服器搭建 發布:2025-05-14 20:25:36 瀏覽:524
汽修汽配源碼 發布:2025-05-14 20:08:53 瀏覽:742
蜜蜂編程官網 發布:2025-05-14 19:59:28 瀏覽:57
優酷怎麼給視頻加密 發布:2025-05-14 19:31:34 瀏覽:635
夢三國2副本腳本 發布:2025-05-14 19:29:58 瀏覽:860
phpxmlhttp 發布:2025-05-14 19:29:58 瀏覽:434
Pua腳本 發布:2025-05-14 19:24:56 瀏覽:449
蘋果像素低為什麼比安卓好 發布:2025-05-14 19:13:23 瀏覽:461
安卓機微信怎麼設置紅包提醒 發布:2025-05-14 19:00:15 瀏覽:272