android學習(2) 多線程的理解

多線程操做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);//此爲實現類必需要實現的方法
        }
    }

 

 

若有不正確或不嚴謹的地方歡迎指正、探討。多謝!

相關文章
相關標籤/搜索