關於安卓中的Handler
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)方法中了