05_消息機制與異步任務

1.理論概述

說明

  • 在Android中,只有在UIThread中才能直接更新界面緩存

  • 在Android中,長時間的工做(聯網)都須要在workerThread中執行服務器

  • 在分線程得到服務器數據後, 須要當即到主線程去更新界面顯示數據網絡

 

  • 如何實現線程間通訊呢?多線程

    消息機制異步

    異步任務oop

測試用例測試

 

2.消息機制

2.1 相關API

  • Message :消息 編碼

    • 可理解爲線程間通信的數據單元, 可經過message攜帶須要的數據spa

    • 建立對象: Message.obtain(what)線程

    • 封裝數據

      •   public int what //id 標識

      •   public int arg1

      •   public int arg2

      •   public Object obj

  • Handler : 處理器

    • Handler是Message的處理器,同時也負責消息的發送和移除的工做

    • 發送即時消息: sendMessage(Message msg)

    • 發送延時消息: sendMessageDelayed(Message msg, long time)

    • 處理消息: handleMessage(Message msg) (回調方法)

    • 移除還未處理的消息: removeMessages(int what)

  • MessageQueue : 消息隊列

    • 用來存放經過Handler發送的消息

    • 它是一個按Message的when排序的優先級隊列

  • Looper(鉤子) : 循環器

    • 負責循環取出Message Queue裏面的當前須要處理的Message

    • 交給對應的Handler進行處理

    • 處理完後, 將Message緩存到消息池中, 以備複用

2.2 測試用例

功能描述

  1. 點擊GET請求獲取: 顯示提示正在加載的進度條, 分線程請求網絡

  2. 獲得數據後, 將數據顯示到輸入框中, 同時隱藏進度條

 

使用Handler的通常步驟

  1. 建立Handler成員變量對象, 並重寫其handleMessage()

  1. 在分/主線程建立Message對象

  1. 使用handler對象發送Message

  1. 在handleMessage()中處理消息

2.3 應用小DEMO

功能描述

1. 初始時

  顯示10,能夠經過點擊按鈕改變其值

2. 點擊「自動增長」    

  每隔1S上面的文本數值增長1,但最大顯示20並做出提示

3. 點擊「自動減小」    

  每隔1S上面的文本數值減小1,但最小顯示1並做出提示

4. 點擊「暫停」  

  上面的數值文本再也不變化

2.4 消息機制原理

原理圖一

原理圖二

 

3.異步任務

理解

  • 什麼是異步任務?

    • 邏輯上: 以多線程的方式完成的功能需求

    • API上: 指AsyncTask類

  • AsyncTask的理解

  • 在沒有AsyncTask以前, 咱們用Handler+Thread就能夠實現異步任務的功能需求

  • AsyncTask是對Handler和Thread的封裝, 使用它更編碼更簡潔,更高效

  • AsyncTask封裝了ThreadPool, 比直接使用Thread效率要高

3.1 相關API

  • AsyncTask: 簡化Handler處理多線程通訊的問題

  • AsyncTask<Params, Progress, Result>

    • Params 啓動任務執行的輸入參數,好比HTTP請求的URL。

    • Progress 後臺任務執行的百分比。

    • Result 後臺執行任務最終返回的結果,好比String。

  • execute(Params... params) :啓動任務, 開始任務的執行流程

  • void onPreExecute():在分線程工做開始以前在UIThread中執行,通常用來顯示提示視圖

  • Result doInBackground(Params... params):  在workerThread中執行, 完成任務的主要工做,一般須要較長的時間

  • void onPostExecute(Result result): 在doInBackground()執行完後在UIThread中執行,通常用來更新界面

  • publishProgress(Progress... values) : 在分線程中, 發佈當前進度

  • void onProgressUpdate(Progress... values) : 在主線程中更新進度

3.2 測試用例

 

3.3 異步任務過程

過程分析圖

4.應用練習

動態顯示帶圖片列表

相關文章
相關標籤/搜索