Android Handler訊息機制

2021-08-14 20:07:05 字數 2097 閱讀 3980

handler訊息機制

優點:

寫法:

1.主線程中建立乙個handler物件

handler handler = new handler(){};

2.複寫handler物件的handlermessage方法

public void handlemessage(android.os.message msg)

3.在子執行緒中建立乙個message物件

message msg =  message.obtain();

4.將結果繫結給message

msg.obj = bitmap;

5.使用主線程中的handler物件將message傳送給主線程處理

handler.sendmessage(msg);

6.主線程中的handlermessage方法接受子執行緒發來的message物件;獲取結果,處理ui.

bitmap bitmap =  (bitmap) msg.obj;

iv_pic.setimagebitmap(bitmap);

例子:主線程:

//☆☆1.在主線程建立乙個handler物件

//☆☆2.複寫handler物件的handlermessage方法

private handler handler = new handler(); };

子執行緒:

//☆☆3.在子執行緒中建立乙個message物件

message msg = new message();

//☆☆4.將網路訪問獲取的結果繫結到message物件上

msg.obj = result;

//☆☆5.使用主線程中建立的handler物件,傳送乙個message物件到主線程

handler.sendmessage(msg);

原理:

涉及物件: 

handler: 主要在子執行緒中將message傳送給主線程,在主線程中接受message並處理。

每乙個handler例項,都有乙個單獨的執行緒與之配合。

message:乙個訊息物件,主要在子執行緒中繫結結果,攜帶到主線程。

messagequeue:位於主線程,是乙個訊息佇列,接受子執行緒中發來的乙個message物件。

looper: 訊息迴圈器,不斷的從messagequeue中取出乙個個message物件。

常見訊息處理api

1. 面試題:子執行緒不能夠更新ui嗎? 

1.審計機制:

activity完全展示之後,審計機制才會工作去檢測子執行緒是否更新ui,如果更新就報錯

;        

activity沒有完全顯示之前(oncreate方法沒執行完畢),審計機制不會工作,就不會檢測子執行緒中做的事情,

所以即使更新ui也不會報錯。

2.android中,與進度條相關的控制項   也可以在子執行緒中更新ui.

3.su***ceview 也可在子執行緒中更新ui. 

方法中的runnable都會被傳送到主線程中執行。

runonuithread(new runnable()

});3. handler.post方法,

將執行的動作傳送到主線程中執行

handler.post(new runnable()

});ps:主線程中需要建立handler物件  handler handler = new handler( );

4.handler.postdelayed方法,

將執行的動作延時多長時間後傳送到主線程中執行

;  delaymillis:延時時間

handler.postdelayed(new runnable()

}, 5000);

子執行緒相關

第四種方式有乙個應用場景:展示廣告多少秒後,跳轉主介面。

Android Handler 工作原理

handler message messagequeue looper 1.looper.prepare public static void prepare private static void prepare boolean quitallowed 這裡建立的looper sthreadloc...

Android Handler相關問題

1 handler是什麼?答 handler是更新ui介面的機制,也是訊息處理的機制,我們可以傳送訊息,也可以處理訊息 2 為什麼要有handler?答 android在設計的時候,封裝了一套訊息建立 傳遞 處理機制,如果不遵循這樣的機制就沒辦法更新ui資訊,就會丟擲異常。3 handler怎麼用?...

android handler呼叫post方法阻塞

1.試下用postdelayed runnable a,int time 因為post把訊息放到looper中就返回,但looper中沒有其他訊息又會被立刻取出來執行,這樣就有可能做了run中的操作,而沒有及時重新整理按鈕.2.另外,這種做法耗時操作仍然是由ui執行緒去做了。而不是你想的另起了執行緒...