后臺輪詢線程(Thread)不斷訪問任務隊列(LinkList<Runnable>),如果任務隊列中有加載圖片的任務(Runnable),就通過Handler發消息給線程池(ExecuterService),讓線程池拿出一個子線程,然后根據調度任務的策略(LIFO)從任務隊列中取出一個任務去完成圖片的獲取,因為圖片是異步的在子線程中獲取到的,不能直接顯示,所以需要通過一個UI相關的Handler把圖片對象發送到UI線程中,最后完成圖片的顯示。把這個邏輯搞清楚了,回頭再看看,需要設計哪些變量,一目了然。
2016-03-26
這是用Thread、Handler、Message自己實現圖片加載功能,且包含了內存緩存和圖片壓縮,實際上也就是實現了一個圖片加載庫,幫助我們搞清楚原理,在不清楚原理的情況下可以用第三方庫直接在GridView顯示本地圖片,但要注意不要使用磁盤緩存...
2016-03-23
其實用HandlerThread實現和用Thread+Handler機制是一樣的。用HandlerThread,其實也是創建了Thread,Thread里創建了Looper對象,然后將線程的Looper對象傳遞給Handler,自然handler的消息處理是在子線程中執行了。
學習要知其然,更要知其所以然。
學習要知其然,更要知其所以然。
2016-03-11
這里我說一下UI線程中Handler的創建和子線程中Handler的創建。其實,這個Util里,初始化UI Handler的時候,應該如下:
mUIHandler = new Handler(Looper.getMainLooper());
是為了防止這個類在子線程中調用,導致UI Handler失效。
看過Handler、Looper、Message源碼的同學應該知道,Handler默認構造函數中,會獲取當前所在線程的Looper作為自己的Looper對象。所以,Handler在UI線程中初始化,獲取的是UI的Looper,在子線程中初始化,獲取的是子線程的Looper。
mUIHandler = new Handler(Looper.getMainLooper());
是為了防止這個類在子線程中調用,導致UI Handler失效。
看過Handler、Looper、Message源碼的同學應該知道,Handler默認構造函數中,會獲取當前所在線程的Looper作為自己的Looper對象。所以,Handler在UI線程中初始化,獲取的是UI的Looper,在子線程中初始化,獲取的是子線程的Looper。
2016-03-11