一、為什么必須使用Handler
-
線程安全問題
這個問題要理解的話很容易,如果沒有這個約束,那么同時有兩個線程對一個UI控件進行調整,
那么控件自然就沒法正常的工作,而為了解決這種二義性(就是一個東西同時被多個使用者使用,
從而無法判斷按哪個使用者來調整)。而Handler永遠都是在UI主線程,這就意味着對一個控件的修
改永遠只會有一個線程,不會存在多個線程同時修改一個控件。
-
統一管理
通過Handler可以統一進行對UI的管理,因為Handler采用消息處理的機制。簡單理解就是另
一個線程發送一個編號給消息所在的線程,那么該線程的消息處理程序就會收到該消息並進行處理,
而消息采用int類型,所以int能夠表示多少種數字就以為着有多少消息可以給你使用(因為存在系統
的消息,所以可能有一部分被系統的消息占有,而不能使用)。
二、Handler介紹
-
handleMessage(Message msg)
需要重寫的方法,該方法為處理消息的核心函數。
-
sendEmptyMessage(int what)
發送指定的消息,該方法為僅僅只是傳遞一個int值來表示發送的消息類型。
三、重寫handleMessage(Message msg)
1 Handler handler = new Handler(){
2 @Override
3 public void handleMessage(Message msg){
4 //獲得通過handler.sendEmptyMessage發送的消息編碼
5 int what = msg.what;
6 /* 處理代碼 */
7 }
8 }
四、使用handler發送消息
1 handler.sendEmptyMessage(0x101);
五、實例
- 新建一個線程來給主線程發送消息
1 public class MainActivity extends Activity{
2 private static final int send_msg_code = 0x101;
3
4 Handler handler = new Handler(){
5 @Override
6 public void handleMessage(Message msg){
7 int what = msg.what;
8 if(what == send_msg_code){
9 Toast.makeText(MainActivity.this,"成功",Toast.LENGTH_SHORT).show();
10 }
11 }
12 }
13
14 @Override
15 protected void onCreate(Bundle savedInstanceState)
16 {
17 new Thread(new Runnable(){
18 handler.sendEmptyMessage(send_msg_code);
19 }).start();
20 }
21 }
六、擴展
-
post(Runnable r)
將r加入到消息隊列中(其實就是利用UI主線程執行一段代碼,這樣可以隨時在其他線程中調整控件)
-
postDelayed(Runnabled r,long delayMillis)
將r加入到消息隊列中,並在指定時間之后觸發(單位為毫秒)
-
removeMessages(int what)
取消消息的發送
-
sendMessages(Message msg)
通過Message發送消息(這樣可以將數據包裝進去,一起發送過去)