Android開發藝術探索
第十章Android的消息機制+第十一章Android的線程和線程池
- 什么是Handler
答:Handler是Android消息機制的上層接口,主要作用是將一個任務切換到某個指定線程執行,解決的主要問題是在子線程中無法訪問UI的矛盾 - 什么是ThreadLocal?
答:ThreadLocal是Handler內部獲取當前線程Looper的方式,可以在不同的線程中存取數據 - 系統為什么不允許在子線程中訪問UI?
答:在Android中對UI的訪問不是線程安全的。如果加上鎖機制的話,缺點有兩個:
① 加上鎖機制會讓UI的訪問邏輯變復雜
② 鎖機制會降低UI訪問的效率,因為鎖機制會阻塞某些線程的運行 - Looper在線程中的存取是通過ThreadLocal來實現的(不同線程中有不同的Looper)
- ThreadLocal的實現原理?
答:不同線程訪問同一個ThreadLocal的get方法,ThreadLocal內部會從各自的線程中取出一個數組,然后再從數組中根據當前ThreadLocal的索引去查找相應的Value值。因為不同線程中的數組是不同的,所以得到的值互不影響 - 消息隊列是通過單鏈表的數據結構來維護消息列表的
- Looper在消息機制中扮演消息循環的角色。Looper中getMainLooper可以會的主線程的Looper
- Looper退出的兩種方式?
答:quit和quitSafely
① quit會直接退出Looper
② quitSafely設定一個退出標記,然后把消息隊列中的已有消息處理完之后才安全退出 - 為什么Handler在創建線程中處理消息?
答:主要因為msg.target.dispatchMessage方法。msg.target是發送這條消息的Handler對象,這樣能夠Handler.dispatchMessage方法是在創建Handler時所使用的Looper中執行,也就是Handler線程 - Handler的工作原理
答:Handler主要包括發送過程和接收過程。
發送過程:僅僅是向消息隊列中插入一條消息
接收過程:handlerMessage進行處理
第十一章Android的線程和線程池
- Android中的特殊線程----AsyncTask和IntentService
答:
AsyncTask:是一種輕量級的異步任務類,但并不適合進行特別耗時的后臺任務,這類任務建議用線程池
IntentService:內部采用HandlerThread(實現了Handler的Thread),這種方式啟動的Service會自動創建線程來執行,并且當任務執行完畢后會自動退出。優點:①自動采用多線程方式執行 ②不容易被系統殺死從而可以保證任務的執行 ③可以在任務執行完畢后自動停止服務 - Android中線程池的優點
答:
① 重用線程池中的線程,避免因為線程的創建和銷毀帶來的性能開銷
② 能有效控制線程池的最大并發數,避免大量的線程之間因互相搶占系統資源而導致阻塞現象
③ 能夠進行簡單的線程管理 - Android中線程池的分類
答:
①:FixedThreadPool:線程數量固定的線程池,所有線程都是核心線程,當線程空閑時不會被回收。
使用范圍:快速響應外界請求
②:CachedThreadPool:線程數量不定的線程池,只有非核心線程,空閑線程有超時機制,超時回收
使用范圍:執行大量的耗時較少的任務
③: ScheduledThreadPool:核心線程數量固定,非核心線程數量不定
使用范圍:定時任務和固定周期的任務
④:SingleThreadPool:只有一個核心線程,確保所有的任務都在同一個線程中按順序執行
使用范圍:不需要處理線程同步問題