-
/** * 由于構造方法為private,因此外界只能通過類名.方法名獲得實例 * @return * @param i * @param lifo */ public static ImageLoader getInstance(int i, Type lifo){ //兩重判斷:為了提高效率 if (mInstance == null){ //先判斷是否為空,若是空,則需要創建實例,否 則不需要創建實例,此層過濾到了大部分的代碼 synchronized (ImageLoader.class){ /*因為上步未做同步處理,所以有可能有多個線程進入此步,這時做同步處理,(當然此時需要同步處理的線程就比較少了,提高了效率)線程就只能一個一個往下*/ if (mInstance == null){ /*排隊進來的線程需要再次判斷mInstance是否為空,比如:synchronized之前進來了兩個線程A和B,A先執行if (mInstance == null)判斷,且創建了一個實例, 然后B再接著判斷if (mInstance == null)時,就不需要再次創建實例了*/ mInstance = new ImageLoader(DEFAULT_THREAD_COUNT, Type.LIFO); } } } return mInstance; }查看全部
-
圖片加載流程: 在gridItem的getView中來進行圖片的查找 getView() { url --> Bitmap //根據url來加載Bitmap url --> LruCache查找 //首先,根據url到LruCache中查找 --> 找到直接返回 --> 找不到的話,根據url -> 創建一個Task -> 將Task加入到TaskQueue 且發送一個通知去提醒后臺輪詢線程 -> 后臺輪詢線程從TaskQueue中提取任務Task -> 將Task發到線程池中去執行->執行的內容如下: Task -- > run(){根據url加載圖片: 1、獲得圖片顯示的大小 2、使用Options對圖片進行壓縮 3、加載圖片且放入LruCache } } 后臺輪詢線程的實現: 不是通過新啟一個線程來不斷的循環,因為這樣效率很低。 new Thread(){ run(){ while(true){ } } }.start(); 我們是通過Handler + Looper + Message來實現查看全部
-
lrucache查看全部
-
option,處理圖片,查看全部
-
加載圖圖片需要達到的要求查看全部
-
選擇圖片需要對圖片進行壓縮,避免內存溢出查看全部
-
popwindow布局查看全部
-
lurcache初始化查看全部
-
imagerLoader的成員變量查看全部
-
2.1 單例模式兩重判斷,防止兩個線程同時創建對象查看全部
舉報
0/150
提交
取消