Imageloader5-ImageLoader的变量初始化
生活随笔
收集整理的這篇文章主要介紹了
Imageloader5-ImageLoader的变量初始化
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
UIHandler可以在loadImage時初始化,其余的變量統(tǒng)一在init方法中初始化。getInstance提供讓用戶自定義線程池線程數(shù)量和加載策略的方法。
public class NewImageLoader {/*** 靜態(tài)成員變量*/private static NewImageLoader mImageLoader ;/*** 圖片緩存的核心類 key為圖片的路徑 value為圖片*/private LruCache<String , Bitmap> mLruCache ;/*** 線程池*/private ExecutorService mThreadPool ;private static final int DEFAULT_THREAD_COUNT = 1;/*** 圖片加載策略*/private enum Type{FIFO , LIFO ;}/*** 默認的加載策略*/private Type mType = Type.LIFO ;/*** 任務(wù)隊列*/private LinkedList<Runnable> mTaskQueue ;/*** 后臺輪詢線程*/private Thread mPoolThread ;/*** 后臺輪詢線程的handler ,主要用于接收后臺輪詢線程的消息后從線程池中取出任務(wù)進行執(zhí)行*/private Handler mPoolThreadHandler ;/*** UI線程的Handler ,主要用與接收消息更新顯示圖片*/private Handler mUIHandler ;/*** 私有化構(gòu)造函數(shù),防止外部通過new實例化** 我們希望線程數(shù)和圖片加載的策略可以由用戶指定,我們在實例化ImageLoader傳入這兩個參數(shù)*/private NewImageLoader(int threadCount , Type type){// 初始化ImageLoader的變量init(threadCount , type);}/*** 將獲取NewImageLoader實例的方法暴漏給外部,以通過類名.方法名的方式獲取NewImageLoader實例** 通過雙層判斷,第一次 空值判斷 可以過濾掉大部分,通過線程同步后,再一次進行空值判斷* 可以確保在實例化NewImageLoader時,當有多個線程同時到達時,只有第一個線程實例化NewImageLoader.* 當然也可以將方法設(shè)置為同步方法,只不過是這種處理方式更為高效。*/public static NewImageLoader getInstance(){if( mImageLoader == null){synchronized (NewImageLoader.class){if(mImageLoader == null){// 默認一個線程 , 后進先出的加載策略mImageLoader = new NewImageLoader(DEFAULT_THREAD_COUNT ,Type.LIFO);}}}return mImageLoader ;}/*** 接收用戶指定線程數(shù)和加載策略的 對外提供實例的方法 通過 類名.方法名的方式調(diào)用* @param threadCount* @param type* @return*/public static NewImageLoader getInstance(int threadCount , Type type){if( mImageLoader == null){synchronized (NewImageLoader.class){if(mImageLoader == null){// 默認一個線程 , 后進先出的加載策略mImageLoader = new NewImageLoader(threadCount ,type);}}}return mImageLoader ;}/*** 變量初始化 mLruCache mThreadPool mType mTaskQueue mPoolThread mPoolThreadHandler* @param threadCount* @param type*/private void init(int threadCount, Type type) {/*** mLruCache 初始化*/// 獲取應(yīng)用程序最大可用內(nèi)存int maxMemory = (int) Runtime.getRuntime().maxMemory();int cacheMemory = maxMemory / 8 ;mLruCache = new LruCache<String , Bitmap>(cacheMemory){@Overrideprotected int sizeOf(String key, Bitmap value) {// 計算緩存對象的大小 (每一行占據(jù)的字節(jié)數(shù)* 高度)return value.getRowBytes() * value.getHeight();}} ;/*** mThreadPool 初始化*/mThreadPool = Executors.newFixedThreadPool(threadCount);/*** type 賦值*/mType = type == null ? Type.LIFO : type;/*** mTaskQueue*/mTaskQueue = new LinkedList<Runnable>();/*** mPoolThread 后臺輪詢線程初始化 利用android異步消息處理框架 Looper+Message+Handler實現(xiàn)*/mPoolThread = new Thread(){@Overridepublic void run() {Looper.prepare();mPoolThreadHandler = new Handler(){@Overridepublic void handleMessage(Message msg) {// TODO 線程池從任務(wù)隊列中去取出一個任務(wù)進行執(zhí)行}};Looper.loop();}};mPoolThread.start();}}總結(jié)
以上是生活随笔為你收集整理的Imageloader5-ImageLoader的变量初始化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Imageloader4-ImageLo
- 下一篇: Shell-通过shell启动Java类