1 / 40

Handler

Handler. 鄧姚文 http://www.ywdeng.idv.tw. 什麼是 Handler ?. 處理器 非同步的工作 預約在未來執行某一件工作 每 一個執行緒( Thread )配一個訊息佇列 MessageQueue 將訊息發布到訊息佇列,每一項訊息和一個 Handler 綁在一起 Message. Handler 的用途. 預約在未來處理某項訊息,執行某一項工作 安排某一項工作在另外一個執行緒執行. Handler 的工作排 程 方法. post(Runnable r) 在 Handler 所屬的執行緒執行一項工作 r

Download Presentation

Handler

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Handler 鄧姚文 http://www.ywdeng.idv.tw

  2. 什麼是 Handler? • 處理器 • 非同步的工作 • 預約在未來執行某一件工作 • 每一個執行緒(Thread)配一個訊息佇列 • MessageQueue • 將訊息發布到訊息佇列,每一項訊息和一個 Handler 綁在一起 • Message

  3. Handler 的用途 預約在未來處理某項訊息,執行某一項工作 安排某一項工作在另外一個執行緒執行

  4. Handler 的工作排程方法 post(Runnable r)在 Handler 所屬的執行緒執行一項工作 r postAtTime(Runnable r, long uptimeMillis)在 指定的時間令 Handler 所屬的執行緒執行一項工作 r postDelayed(Runnable r, long delayMillis)延遲一段時間後,令 Handler 所屬的執行緒執行一項工作 r

  5. Handler 的工作排程方法 removeCallbacks (Runnable r) 移除尚未處理的工作 removeCallbacks(Runnable r, Object token) 移除指定物件的工作 removeCallbacksAndMessages(Object token) 移除指定物件的工作與訊息

  6. Handler 的訊息排程方法 sendEmptyMessage(int)送出空白訊息 sendMessage(Message)送出訊息 sendMessageAtTime(Message, long)在指定的時間送出訊息 sendMessageDelayed(Message, long)延遲一段時間後,送出訊息

  7. 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.

  8. Handler 的訊息處理方法 void removeMessages (intwhat) 移除尚未處理的訊息 removeMessages(int what, Object object) 移除特定物件的訊息

  9. 範例一:以Handler控制執行緒 以 Handler 控制執行緒開始與停止

  10. 範例一:以Handler控制執行緒

  11. 範例一:以Handler控制執行緒專案結構

  12. 範例一:以Handler控制執行緒/res/values/strings.xml

  13. 範例一:以Handler控制執行緒/res/layout/main.xml

  14. 範例一:以Handler控制執行緒Main.java 上半部

  15. 範例一:以Handler控制執行緒Main.java 下半部

  16. 練習一:以Handler控制執行緒進一步修改 請修改範例一,加入一個『重設』的按鈕 按下重設按鈕之後,可以重新從 1 數起

  17. 範例二:Handler 小遊戲 • 電腦先打,然後使用者打 • 目標是使用者打出和電腦一樣的長度 • 越接近越好

  18. 範例二:Handler 小遊戲

  19. 範例二:Handler 小遊戲

  20. 範例二:Handler 小遊戲

  21. 範例二:Handler 小遊戲專案結構

  22. 範例二:Handler 小遊戲/res/values/strings.xml

  23. 範例二:Handler 小遊戲/res/layout/main.xml

  24. 範例二:Handler 小遊戲Main.java --- Part 1

  25. 範例二:Handler 小遊戲Main.java --- Part 2

  26. 範例二:Handler 小遊戲Main.java --- Part 3

  27. 範例二:Handler 小遊戲Main.java --- Part 4

  28. Main.java --- Part 5

  29. 範例二:Handler 小遊戲Main.java --- Part 6

  30. 範例二:Handler 小遊戲Main.java --- Part 7

  31. 範例二:Handler 小遊戲Main.java --- Part 8

  32. 範例二:Handler 小遊戲Main.java --- Part 9

  33. 練習二:Handler 小遊戲進一步修改 • 增加一個『重來』按鈕 • 按下『重來』按鈕 之後,整個程式重新執行,電腦重新打擊,然後再換使用者打擊

  34. 效能調整 • 在 Activity 裡面以 Handler 啟動一個 Runnable 並未產生第二個 Thread • Main Thread 和 透過 Handler 執行的 Runnable 是同一個 Thread • 確實產生另一個 Thread 執行 Handler 裡的 Runnable • 使用 HandlerThread產生另一個 Thread • 透過 Looper處理Message&Runnable

  35. 以另一個Thread執行Handler HandlerThreadhandlerThread = new HandlerThread("progress_handler"); handlerThread.start(); ProgressHandlerprogressHandler = new ProgressHandler(handlerThread.getLooper());

  36. 將訊息送到另一個執行緒 Message msg = progressHandler.obtainMessage(); msg.arg1 = ProgressHandler.COMMAND_STOP; msg.obj = progressTask; msg.sendToTarget();

  37. 處理訊息

  38. 練習三:Handler 小遊戲進一步修改 修改範例二:Handler 小遊戲,變成兩個人互相比賽 使用者#1 先打擊,記下成績;然後輪到 使用者#2 打擊,記下 使用者#2 和 使用者#1 差多遠 接著順序交換,使用者#2 先打擊,記下成績;然後輪到 使用者#1 打擊,記下 使用者#1 和 使用者#2 差多遠 比較兩次的差距決定贏家

  39. 練習三 狀態圖State Diagram

More Related