1. 程式人生 > >關於安卓中的Handler

關於安卓中的Handler

Handler是用來執行緒間傳遞資料,在主執行緒將Handler例項化,子執行緒《工作執行緒,執行較長的耗時業務》可以通過Handler傳送資料到主執行緒,當Looper輪詢到Message Queue時,將訊息交給

Handler進行處理,通過回撥handleMessage(Message msg);方法,將子執行緒的資料更新到UI介面; 通過Handler處理多執行緒機制,不影響使用者的其他操作,不阻塞主執行緒,讓使用者有更好的體驗效果;

(一):Handler 是在面試中會問到最多的問題之一,同時它又是我們日常開發常用到的,更是多執行緒程式設計必需懂的;

(二):理清Handler 與Looper, MessageQueue,Messsage,Thread間的關係: Handler 我們經常在Activity中直接Handler mHandler=new Handler(); 然後我們就可以用mHandler傳送Message了,那麼我們的這個Message通過mHandler傳送給誰呢? 通過檢視原始碼,我們可以看到:mHandler.sendMessage();方法的內部要呼叫=====>

sendMessageDelayed(msg, 0);====>sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);===>

enqueueMessage(queue, msg, uptimeMillis);  其實它最終是將Message對像入隊MessageQueue中(我們一定要有一個概念,佇列就一定要遵循佇列的規則,先進先出FIFO,就相當於一個儲存器,將所有的Message先儲存),Handler中所持有 MessageQueue 物件mQueue從哪裡來的呢?且看下面的圖片:



      從上圖我們可以看到,我們在建立Handler物件時,程式會先獲取與當前Thread中獲取與當前執行緒關聯的Looper物件(  mLooper = Looper.myLooper()   ),而在Looper中,通過  public static void prepare() { prepare(true);}



ThreadLocal類的使用大家都會吧,sThreadLocal.set(new Looper(quitAllowed));  它在建立Looper對時的時候會去建立MessageQueue物件出來,這樣mHandler.sendMessage();傳送出來的Message就儲存在Looper中的MessageQueue佇列中了;那麼Looper又幹什麼呢?Looper.loop();就是一個死迴圈,不停地檢視MessageQueue中有沒有資料(即Message);一發現在資料了,就立馬取出來  msg.target.dispatchMessage(msg); 將呼叫Handler物件的dispatchMessage()方法,對Message進行派發處理



如上圖所示,Handler中的dipatchMessage()方法對Message進行派發處理,於是Message被回撥到handlerMessage(msg)方法中了