Imageloader<5>-ImageLoader的变量初始化

简介: Imageloader<5>-ImageLoader的变量初始化

UIHandler可以在loadImage时初始化,其余的变量统一在init方法中初始化。getInstance提供让用户自定义线程池线程数量和加载策略的方法。

public class NewImageLoader {
    /**
     * 静态成员变量
     */
    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 ;
    /**
     * 任务队列
     */
    private LinkedList<Runnable> mTaskQueue ;
    /**
     * 后台轮询线程
     */
    private Thread mPoolThread ;
    /**
     * 后台轮询线程的handler ,主要用于接收后台轮询线程的消息后从线程池中取出任务进行执行
     */
    private Handler mPoolThreadHandler ;
    /**
     * UI线程的Handler ,主要用与接收消息更新显示图片
     */
    private Handler mUIHandler ;
    /**
     * 私有化构造函数,防止外部通过new实例化
     *
     * 我们希望线程数和图片加载的策略可以由用户指定,我们在实例化ImageLoader传入这两个参数
     */
    private NewImageLoader(int threadCount , Type type){
        // 初始化ImageLoader的变量
        init(threadCount , type);
    }
    /**
     * 将获取NewImageLoader实例的方法暴漏给外部,以通过类名.方法名的方式获取NewImageLoader实例
     *
     * 通过双层判断,第一次 空值判断 可以过滤掉大部分,通过线程同步后,再一次进行空值判断
     * 可以确保在实例化NewImageLoader时,当有多个线程同时到达时,只有第一个线程实例化NewImageLoader.
     * 当然也可以将方法设置为同步方法,只不过是这种处理方式更为高效。
     */
    public static NewImageLoader getInstance(){
        if( mImageLoader == null){
            synchronized (NewImageLoader.class){
                if(mImageLoader == null){
                    // 默认一个线程 , 后进先出的加载策略
                    mImageLoader = new NewImageLoader(DEFAULT_THREAD_COUNT ,Type.LIFO);
                }
            }
        }
        return mImageLoader ;
    }
    /**
     *  接收用户指定线程数和加载策略的 对外提供实例的方法  通过 类名.方法名的方式调用
     * @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 初始化
         */
        // 获取应用程序最大可用内存
        int maxMemory = (int) Runtime.getRuntime().maxMemory();
        int cacheMemory = maxMemory / 8 ;
        mLruCache = new LruCache<String , Bitmap>(cacheMemory){
            @Override
            protected int sizeOf(String key, Bitmap value) {
                // 计算缓存对象的大小   (每一行占据的字节数* 高度)
                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实现
         */
        mPoolThread = new Thread(){
            @Override
            public void run() {
                Looper.prepare();
                mPoolThreadHandler = new Handler(){
                    @Override
                    public void handleMessage(Message msg) {
                        // TODO 线程池从任务队列中去取出一个任务进行执行
                    }
                };
                Looper.loop();
            }
        };
        mPoolThread.start();
    }
}
相关文章
【EDA】 Verdi 使用笔记
【EDA】 Verdi 使用笔记
3331 0
【EDA】 Verdi 使用笔记
|
8月前
|
机器学习/深度学习 数据采集 运维
机器学习在网络流量预测中的应用:运维人员的智慧水晶球?
机器学习在网络流量预测中的应用:运维人员的智慧水晶球?
354 19
|
9月前
|
自然语言处理 安全 API
API First:模型驱动的阿里云API保障体系
本文介绍了阿里云在API设计和管理方面的最佳实践。首先,通过API First和模型驱动的方式确保API的安全、稳定和效率。其次,分享了阿里云内部如何使用CloudSpec IDL语言及配套工具保障API质量,并实现自动化生成多语言SDK等工具。接着,描述了API从设计到上线的完整生命周期,包括规范校验、企业级能力接入、测试和发布等环节。最后,展望了未来,强调了持续提升API质量和开源CloudSpec IDL的重要性,以促进社区共建更好的API生态。
|
Web App开发 应用服务中间件 网络安全
如何在 Apache 和 Nginx 上配置 OCSP Stapling
如何在 Apache 和 Nginx 上配置 OCSP Stapling
421 9
|
Java 测试技术 数据库连接
Spring Boot中的嵌入式数据库使用
Spring Boot中的嵌入式数据库使用
|
前端开发 搜索推荐 JavaScript
Web前端网站(四)- 音乐播放器
【8月更文挑战第9天】页面整体色调背景采用柔和渐变的方式呈现,与主页面的“毒药水式”色彩搭配形成了强烈的对比;周边花瓣缓缓飘落到水面之上形成涟漪。整体给人一种温馨、浪漫的感觉,还可以通过中间的3个按钮来控制音乐的切换和播放效果。每一行代码都有详细注释~~~大家可以尽情创作
183 2
Web前端网站(四)- 音乐播放器
|
Java Apache
Java代码使用POI导出的单元格加上边框和背景色
【5月更文挑战第3天】Java代码使用POI导出的单元格加上边框和背景色
1259 0
|
JavaScript 前端开发 测试技术
理解 Proxy 和 Object.defineProperty:提升你的 JavaScript 技能(上)
理解 Proxy 和 Object.defineProperty:提升你的 JavaScript 技能(上)
理解 Proxy 和 Object.defineProperty:提升你的 JavaScript 技能(上)
【中级软件设计师】—(下午题)试题一精讲总结(四十)
【中级软件设计师】—(下午题)试题一精讲总结(四十)
|
XML 前端开发 数据安全/隐私保护
Shiro - RememberMe记住我功能实现
Shiro - RememberMe记住我功能实现
271 1