在Android中,只有在UIThread中才能直接更新界面緩存
在Android中,長時間的工做(聯網)都須要在workerThread中執行服務器
在分線程得到服務器數據後, 須要當即到主線程去更新界面顯示數據網絡
多線程
消息機制異步
異步任務oop
測試用例測試
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緩存到消息池中, 以備複用
功能描述
點擊GET請求獲取: 顯示提示正在加載的進度條, 分線程請求網絡
使用Handler的通常步驟
建立Handler成員變量對象, 並重寫其handleMessage()
在分/主線程建立Message對象
使用handler對象發送Message
功能描述
1. 初始時
顯示10,能夠經過點擊按鈕改變其值
2. 點擊「自動增長」
每隔1S上面的文本數值增長1,但最大顯示20並做出提示
3. 點擊「自動減小」
每隔1S上面的文本數值減小1,但最小顯示1並做出提示
4. 點擊「暫停」
上面的數值文本再也不變化
原理圖一
原理圖二
理解
邏輯上: 以多線程的方式完成的功能需求
API上: 指AsyncTask類
AsyncTask的理解
在沒有AsyncTask以前, 咱們用Handler+Thread就能夠實現異步任務的功能需求
AsyncTask是對Handler和Thread的封裝, 使用它更編碼更簡潔,更高效
AsyncTask封裝了ThreadPool, 比直接使用Thread效率要高
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) : 在主線程中更新進度
過程分析圖