2022年3月26日 星期六

android studio:handler

APP程式在執行時有主執行緒和副執行緒,而系統為避免主執行緒和副執行緒同時執行,導至呈現畫面的UI(User Interface使用者介面)產生錯亂,因此設計只能在主執行緒更新UI的畫面。那在背景執行副執行緒時,就必需透一個方法,告知主執行緒要更新了。兩者之間的溝通,會依靠handler,handler是一個控制器,提供了一處理與發送消息的方法。

handler在主執行緒中建立時,此時會默認執行一個Looper的方法,讓它重覆的監聽訊息,另外在Lopper創建時,也會自動生成一個MessageQueue,這裡面的Message類有what(定義如何操作此方法)、obj(物件的變量)、arg1(簡單的整數類型)、 arg2等變量,可以作為主副執行緒資料溝通的方法,在副執行緒中,當要處理的方法取得資料時,就透過Message類別方法傳訊息給主執行緒處理。

實作的方法大概如下:

(1)在主要的執行緒中建立handler,這個handler會做的工作是重覆執行,用以監聽副執行緒是否有傳入message:大概的方法如下:

handler = new Handler(){ //宣告一個新的hander
@Override
public void handleMessage(@NonNull Message msg) {
//super.handleMessage(msg);
switch (msg.what){ //利用message.what判斷是那個message傳入的訊息
case 1:
textView.setText(msg.obj.toString()); //此處要執行的程式
break;
case 2:
break;
}
}
};

(2)在副執行緒中適當的地方,當你完成你的工作時,可透過sendMessage的方法,將訊息傳回主要的執行緒,傳送的方法如下:

Message message=Message.obtain(); //宣告一個要傳送的message元件
message.what=1; //設定message.what=1 如果有很多不同的hander訊息,這個what可判斷是那一個hander
message.obj=data; //data為要傳送的資料
handler.sendMessage(message); //將想要傳出的訊息用sendMessage傳出,參數為要傳出的訊息。


其它補充:
(1)將 Runnable 添加Runnable在handler的監測列中。
handler.post(Runnable r),參數為要執行的Runable。
(2)Runnable 添加Runnable在handler的監測列中。,並指定執行延遲的時間。
handler.postDelayed(Runnable r, long delayMillis) 參數一為要執行的Runable,參數二為延遲的毫秒數。
(3)刪除handler中的Runnable監測
handler.removeCallbacks(Runnable r),參數一要停止的Runnable
handler.removeCallbacks(Runnable r, Object token),參數一為要停止的Runnable,參數二為傳送的obj資料。
handler.removeCallbacksAndMessages(Object token) 參數為要傳送的obj
handler.removeMessages(int what),參數為要傳送的waht
(4)發送handler裡的thread處理完要發送的message
handler.sendMessage(Message msg),參數一要發送的訊息
handler.sendMessageDelayed(Message msg, long delayMillis),參數一要發送的訊息,參數二為延時傳送的時間
(5)於handler 中接收訊息的方法
handleMessage(Message msg) 參數一為副執行緒中回傳的Message。


參考網頁:
https://developer.android.com/reference/android/os/Handler
https://blog.csdn.net/wenzhi20102321/article/details/107888152
https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/737182/




沒有留言:

張貼留言