410 likes | 667 Views
Handler. 鄧姚文 http://www.ywdeng.idv.tw. 什麼是 Handler ?. 處理器 非同步的工作 預約在未來執行某一件工作 每 一個執行緒( Thread )配一個訊息佇列 MessageQueue 將訊息發布到訊息佇列,每一項訊息和一個 Handler 綁在一起 Message. Handler 的用途. 預約在未來處理某項訊息,執行某一項工作 安排某一項工作在另外一個執行緒執行. Handler 的工作排 程 方法. post(Runnable r) 在 Handler 所屬的執行緒執行一項工作 r
E N D
Handler 鄧姚文 http://www.ywdeng.idv.tw
什麼是 Handler? • 處理器 • 非同步的工作 • 預約在未來執行某一件工作 • 每一個執行緒(Thread)配一個訊息佇列 • MessageQueue • 將訊息發布到訊息佇列,每一項訊息和一個 Handler 綁在一起 • Message
Handler 的用途 預約在未來處理某項訊息,執行某一項工作 安排某一項工作在另外一個執行緒執行
Handler 的工作排程方法 post(Runnable r)在 Handler 所屬的執行緒執行一項工作 r postAtTime(Runnable r, long uptimeMillis)在 指定的時間令 Handler 所屬的執行緒執行一項工作 r postDelayed(Runnable r, long delayMillis)延遲一段時間後,令 Handler 所屬的執行緒執行一項工作 r
Handler 的工作排程方法 removeCallbacks (Runnable r) 移除尚未處理的工作 removeCallbacks(Runnable r, Object token) 移除指定物件的工作 removeCallbacksAndMessages(Object token) 移除指定物件的工作與訊息
Handler 的訊息排程方法 sendEmptyMessage(int)送出空白訊息 sendMessage(Message)送出訊息 sendMessageAtTime(Message, long)在指定的時間送出訊息 sendMessageDelayed(Message, long)延遲一段時間後,送出訊息
Handler 的訊息處理方法 • dispatchMessage (Message msg) 處理訊息 • handleMessage (Message msg) 接收訊息,子類別必須實作這個方法,才能夠接收訊息 • hasMessages (int what, Object object) hasMessages (int what) 檢查佇列裡面是否還有訊息 • obtainMessage () 取得訊息obtainMessage (int what, int arg1, int arg2) obtainMessage (int what, int arg1, int arg2, Object obj) • what Value to assign to the returned Message.what field. • arg1 Value to assign to the returned Message.arg1 field. • arg2 Value to assign to the returned Message.arg2 field. • obj Value to assign to the returned Message.obj field.
Handler 的訊息處理方法 void removeMessages (intwhat) 移除尚未處理的訊息 removeMessages(int what, Object object) 移除特定物件的訊息
範例一:以Handler控制執行緒 以 Handler 控制執行緒開始與停止
練習一:以Handler控制執行緒進一步修改 請修改範例一,加入一個『重設』的按鈕 按下重設按鈕之後,可以重新從 1 數起
範例二:Handler 小遊戲 • 電腦先打,然後使用者打 • 目標是使用者打出和電腦一樣的長度 • 越接近越好
練習二:Handler 小遊戲進一步修改 • 增加一個『重來』按鈕 • 按下『重來』按鈕 之後,整個程式重新執行,電腦重新打擊,然後再換使用者打擊
效能調整 • 在 Activity 裡面以 Handler 啟動一個 Runnable 並未產生第二個 Thread • Main Thread 和 透過 Handler 執行的 Runnable 是同一個 Thread • 確實產生另一個 Thread 執行 Handler 裡的 Runnable • 使用 HandlerThread產生另一個 Thread • 透過 Looper處理Message&Runnable
以另一個Thread執行Handler HandlerThreadhandlerThread = new HandlerThread("progress_handler"); handlerThread.start(); ProgressHandlerprogressHandler = new ProgressHandler(handlerThread.getLooper());
將訊息送到另一個執行緒 Message msg = progressHandler.obtainMessage(); msg.arg1 = ProgressHandler.COMMAND_STOP; msg.obj = progressTask; msg.sendToTarget();
練習三:Handler 小遊戲進一步修改 修改範例二:Handler 小遊戲,變成兩個人互相比賽 使用者#1 先打擊,記下成績;然後輪到 使用者#2 打擊,記下 使用者#2 和 使用者#1 差多遠 接著順序交換,使用者#2 先打擊,記下成績;然後輪到 使用者#1 打擊,記下 使用者#1 和 使用者#2 差多遠 比較兩次的差距決定贏家