Android開發藝術探索 第十章 學習

爲什麼從第十章開始呢,因爲Android開發藝術探索這本書每一章基本都沒有什麼聯繫。

所以我們可以從任意一章開始讀起。

怎麼選擇要讀哪一章呢,個人認爲是根據自己的喜好以及時間片來決定比較合理。

比如我對ThreadLocal比較有興趣,上次本來要了解這個但是因爲別的事沒去看,加上我下午要出去時間短,而第十章內容又少。所以選擇了第十章做破冰章。

讀書就是這樣子呀,開始讀了第一張才後繼續往後看。不然總是放在旁邊。

加油,今天是2016年5月14日。


正式開始看書了。

記錄要點:

1,Handler可以將一項任務切換到其所在線程中運行。這個線程不一定是主線程,任務也不一定是UI工作。話說真的有人認爲handler只能用來更新UI麼。。。

2,ThreadLocal並不是線程,它用來在線程中存儲數據。一般在handler內部通過ThreadLocal來獲取當前線程的Looper。

3,非UI線程默認沒有looper,要先創建looper才能用handler。


4,關於Android如何知道UI操作是否在主線程中進行呢?

答案是:在ViewRootImpl的checkThread函數中會判斷mThread也就是主線程是否與當前線程也就是Thread.currentThread()相同,如果不同就證明不是在UI主線程中進行UI操作。

5,作者認爲handler的出現主要是爲了解決子線程中無法訪問UI的問題,這點不是很同意。個人覺得Handler是一種方法,他主要目的是在各個線程之間進行任務切換,當然現在可能大家用的比較多的是從子線程中切換到UI主線程。

6,子線程中爲何不允許進行UI操作。答:因爲UI控件一般是線程不安全的。多線程併發容易導致異常。

7,那麼給UI控件訪問加鎖不就線程安全了麼?答:1,加鎖會讓UI訪問更加複雜,代碼量更大,維護更加困難,稍不注意還容易引起死鎖什麼的。2,UI訪問效率降低,加鎖會降低UI訪問效率。一個線程可能很久都阻塞在等待某個控件的權限。

簡單的說,多個線程同時訪問一個控件,那只有一個線程可以訪問,其他線程都啥也做不了了,都阻塞了。

8,Handler必須依賴looper存在。非UI線程默認沒有looper要自己創建。

9,Handler的post方法內部最終使用send來進行任務或者消息發送。可以傳遞的信息有msg和runnable。

10, handler負責發送消息給MessageQueue,looper發現新消息就去調用對應的runnable或者handleMessage.

11,ThreadLocal在不同線程對象中所存儲的指相互沒有聯繫。這也是他loacl的含義。

未完待續





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章