多線程操做UI的運行原理:java
UI線程:首先啓動app時,系統會自動啓動一個UI線程,而後此線程會建立一個Looper(注:Looper構造函數會實例化一個MessageQueue的消息隊列存在變量mQueue中),並經過調用loop方法來運行一個無限循環的for,此for裏面經過MessageQueue.next()方法不間斷的檢索消息隊列中的Message(若是消息隊列爲空,將阻塞等待),獲取到Message後,則執行message.target(此字段存儲的Handler類的實例)的dispatchMessage(Message msg)方法,而後執行recycle()方法回收Message對象(系統維護一個Message對象池,貌似爲50個)。多線程
Handler:若是是子線程有結果須要反饋給UI線程,則Handler須要在UI線程中如實例化,反之則在子線程中實例化Handler。由於Handler默認實例化時使用的Looper爲當前線程的Looperapp
Handler部分代碼截取:async
public Handler(Callback callback, boolean async) { if (FIND_POTENTIAL_LEAKS) { final Class<? extends Handler> klass = getClass(); if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) && (klass.getModifiers() & Modifier.STATIC) == 0) { Log.w(TAG, "The following Handler class should be static or leaks might occur: " + klass.getCanonicalName()); } } mLooper = Looper.myLooper();//此處就是設置獲取當前線程的Looper存儲到mLooper變量中 if (mLooper == null) { throw new RuntimeException( "Can't create handler inside thread that has not called Looper.prepare()"); } mQueue = mLooper.mQueue; mCallback = callback; mAsynchronous = async; }
Handler類提供了多少構造器,能夠直接指定使用那個線程的Looper。ide
public Handler(Looper looper)函數
更多的構造器,請參考源代碼。oop
子線程:建立子線程(HandlerThread:默認建立本身的Looper,Thread:若是須要Looper則要本身手動建立),指定子線程須要執行的代碼,在執行代碼時若是有結果須要反饋給UI線程(如:顯示值到UI上),則只要把此Handler(此Handler必須是UI線程的Handler,也就是必須使用的是UI線程的Looper實例)的Message壓入到UI線程的MessageQueue中便可。獲取此Handler對應的Message實例的方法:能夠經過調用Handler的obtainMessage()方法。壓入MessageQueue的方法:就是調用Handler中的sendMessage(sendEmptyMessageDelayed、sendEmptyMessageAtTime。。。。根據本身需求選擇方法)或者調用Message的sendToTarget()方法,其實這個方法是message調用本身的target變量(存儲Handler的實例)的sendMessage(Message msg)方法,而後把本身當成方法的參數傳過去。this
補充:值得注意的是Handler的dispatchMessage方法spa
Handler部分代碼以下:線程
final Callback mCallback; public interface Callback { public boolean handleMessage(Message msg); } /* Subclasses must implement this to receive messages. */ public void handleMessage(Message msg) { } public void dispatchMessage(Message msg) { if (msg.callback != null) {//若是msg有callback下面的都不會執行了 handleCallback(msg); } else { if (mCallback != null) {//若是Handler有本身的Callback,則根據返回結果來肯定是否執行handleMessage if (mCallback.handleMessage(msg)) { return; } } handleMessage(msg);//此爲實現類必需要實現的方法 } }
若有不正確或不嚴謹的地方歡迎指正、探討。多謝!