日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

android項目實例源碼 android源碼怎么運行

Android消息機制其實指的就是Handler的消息機制 。

android項目實例源碼 android源碼怎么運行


以上模型的解釋:
1.以Handler的sendMessage方法為例,當發(fā)送一個消息后,會將此消息加入消息隊列MessageQueue中 。
【android項目實例源碼 android源碼怎么運行】2.Looper負責去遍歷消息隊列并且將隊列中的消息分發(fā)給對應的Handler進行處理 。
3.在Handler的handleMessage方法中處理該消息,這就完成了一個消息的發(fā)送和處理過程 。這里從圖中可以看到參與消息處理有四個對象,它們分別是 Handler, Message, MessageQueue,Looper 。
ThreadLocal 是一個線程內(nèi)部的數(shù)據(jù)存儲類,通過它可以在指定的線程中存儲數(shù)據(jù),數(shù)據(jù)存儲以后,只有再指定線程中可以獲取到存儲的數(shù)據(jù),對于其他線程來說則無法獲取到數(shù)據(jù) 。
我們看下ThreadLocal是如何存儲數(shù)據(jù)的:
public void set(T value) {Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t);if (map != null)map.set(this, value);elsecreateMap(t, value);}在源碼里面我們可以看出ThreadLocal在存儲數(shù)據(jù)的時候,會先拿到當前線程,然后根據(jù)當前線程會拿到一個叫做ThreadLocalMap 的Map數(shù)組;那么ThreadLocalMap 又是什么呢?
我們可以看到在CreateMap 里面是創(chuàng)建了ThreadLocalMap ,并且把我們當前線程當作Key,傳遞過去的 Value就是我們在調(diào)用ThreadLocal.set(T)傳過來的值
void createMap(Thread t, T firstValue) {t.threadLocals = new ThreadLocalMap(this, firstValue);}
android項目實例源碼 android源碼怎么運行


ThreadLocal是如何獲取數(shù)據(jù)的
public T get() {Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t);//會先根據(jù)當前線程找到對應的ThreadLocalMap,如果沒有就創(chuàng)建if (map != null) {ThreadLocalMap.Entry e = map.getEntry(this);if (e != null) {@SuppressWarnings("unchecked")T result = (T)e.value;return result;}}return setInitialValue();}//如果ThreadLocalMap 就會去創(chuàng)建ThreadLocalMapprivate T setInitialValue() {T value = https://www.jinnalai.com/fenxiang/initialValue();Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t);if (map != null)map.set(this, value);elsecreateMap(t, value);return value;}
android項目實例源碼 android源碼怎么運行


通過以上代碼我們可以看出ThreadLocal是如何保證數(shù)據(jù)存儲以后,只有再指定線程中可以獲取到存儲的數(shù)據(jù),對于其他線程來說則無法獲取到數(shù)據(jù)的了 。
我們?nèi)绾伪WCActicity的默認線程是主線程的呢
在Acticity 中我們用到的線程是ActivityThread這個線程,在這個線程的
main(String[] args)方法里面我們可以看到下面代碼public static void main(String[] args) {Looper.prepareMainLooper();ActivityThread thread = new ActivityThread();thread.attach(false, startSeq);if (sMainThreadHandler == null) {sMainThreadHandler = thread.getHandler();}if (false) {Looper.myLooper().setMessageLogging(newLogPrinter(Log.DEBUG, "ActivityThread"));}Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);Looper.loop();throw new RuntimeException("Main thread loop unexpectedly exited");}
android項目實例源碼 android源碼怎么運行


//上面的代碼里面我們可以看到創(chuàng)建 ActivityThread的 Looper.prepareMainLooper(); Looper.loop(); 保證了 ActivityThread為主線程 。
創(chuàng)建全局唯一Looper對象和全局唯一MessageQueue消息對象

android項目實例源碼 android源碼怎么運行


Activity中創(chuàng)建Handler

android項目實例源碼 android源碼怎么運行

推薦閱讀