handler缺點:如果要運送兩種型別的資料(比如乙個bitmap,乙個object)就不能運送,但可以用bunder來傳輸
* 使用handler的步驟:
* 1、建立乙個handler
* 2、在需要用到資料傳輸的地方通過handler得到message物件,通過message攜帶要傳輸的資料
* 3、直接通過handler傳送訊息到主線程
* 4、在主線中通過重寫handlermessage,接收傳輸過來的資料
如果在oncreate啟動的子執行緒做的操作不耗時,這個時候操作控制項,錯誤是存在的,只是沒有檢測出來,因為這個時候控制項還沒來得及繪製
子執行緒向主線程傳送訊息
程式步驟:
1、傳送乙個空訊息(不用構造message物件,而是直接給乙個訊息標記)
handler.sendemptymessage(1);
2、傳送乙個帶message的資訊
message message = handler.obtainmessage();
//message message2 = message.obtain();
//2.通過這個資訊,攜帶資料
message.obj = "" ; //用來傳輸複雜資料
message.arg1 = 100; //用來傳輸簡單整數型別
message.arg2 = 200; //用來傳輸簡單整數型別
message.what = 300; //一般用來給message打標記的,因為一般可以傳多個message
//3.利用handler傳送訊息,從子執行緒傳送到主線程
handler.sendmessage(message);
//傳送延遲訊息
//handler.sendmessagedelayed(message, 3000); //隔3秒後再傳送訊息
//handler.sendemptymessagedelayed(5, 3000);
主線程向子執行緒傳送訊息
步驟與上面類似。
在接收資料的地方new handler(){} 並重寫方法
在傳送資料的地方sendmessage()
不一樣的地方:
在接收資料的地方,要寫looper.prepare();//相當於初始化looper物件
looper.loop();//迴圈
總結:如果在主線程中接收訊息,就不用寫looper,因為主線程中自帶有乙個looper物件,並且也在迴圈工作;
但在子執行緒中沒有looper物件,所以必須我們自己去建立,並且讓它迴圈。所以,在子執行緒中接收資料之
前要先呼叫looper.prepare()方法,再呼叫looper.loop()方法
//子執行緒中只要有了looper物件,就可以寫吐司。主線程中自帶有looper物件,所以可以直接寫吐司。
//如果把吐司寫到looper.prepare();之前就會報錯。
注意:在子執行緒中延遲傳送要用thread.sleep()方法,不能用handler.sendmessagedelayed(message, 2000);
因為子執行緒一旦啟動了,就會一直進行,所以效果就是只有第一次會延遲傳送訊息,後面的就不會了,就會
一直傳送。而在主線程中就可以使用handler.sendmessagedelayed(message, 2000);來延遲傳送
主線程向主線程傳送訊息方法類似。。。
handler中的post方法
實際上,每乙個空間也有post方法,如下:
handler訊息處理機制
handler主要用來更新ui 因為涉及到執行緒安全,android必須在ui執行緒 即主線程 裡才能更新ui,在其他執行緒裡更新ui會報錯,而一些耗時的操作又必須通過開啟新的執行緒來執行,這就要用到handler來傳遞訊息了。在主線程中建立乙個handler的例項,並重寫handlermessag...
Handler訊息處理機制
剛開始接觸android,邊學習邊做筆記,希望大家多指正。經常在 中看到sendmessage 族的一些函式,開始時總搞不明白訊息傳送到 去了,誰去處理,什麼時候處理。下面是問題解答。至於開始的幾個疑問,我是這樣理解的。訊息傳送出去,就相當於馬上要被處理了。就像進地鐵一樣,已經站到了進站的佇列中 假...
非同步訊息處理機制 Handler
handler面試詳解 一 什麼是handler handler通過傳送和處理 message 和runnable 物件來關聯對應執行緒的 messagequeue.1.可以讓對應的message和 runnable 在未來的某個時間點進行相應處理 2.讓自己想要處理的耗時操作放在子執行緒,讓更新 ...