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){@Overrideprotected 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(){@Overridepublic void run() {Looper.prepare();mPoolThreadHandler = new Handler(){@Overridepublic void handleMessage(Message msg) {// TODO 线程池从任务队列中去取出一个任务进行执行}};Looper.loop();}};mPoolThread.start();}}

Imageloader5-ImageLoader的变量初始化相关推荐

  1. Go 学习笔记(70)— Go 变量声明、变量初始化、值类型变量赋值、指针类型变量赋值

    1. 变量声明 要单纯声明一个变量,可以通过 var 关键字,如下所示: var s string 该示例只是声明了一个变量 s,类型为 string,并没有对它进行初始化,所以它的值为 string ...

  2. c++构造函数以及类中变量初始化顺序

    c++构造函数以及类中变量初始化顺序 Submitted by ant on Fri, 03/29/2013 - 20:05 构造函数 c++ 的类提供了一种抽象机制,使用起来要比 c 方便很多.为了 ...

  3. C代码开发遇到的问题 变量初始化和结构体指针移动

    1. 变量初始化 函数内部的变量如果不初始化的话默认不是0而是一个随机值. 下面的程序用来打印一个未初始化的无符号的整型值,执行几遍,每次的结果都会不一样 #include <stdio.h&g ...

  4. STM32单片机,禁止系统启动时的变量初始化

    使用这个功能是在IAP在线升级时需要用的. 最初使用在EEPROM或者FLASH存储一个标志位.程序跳转到BootLoader,BootLoader来判断是否需要升级.这样是可以用的,但是这样有个弊端 ...

  5. C语言变量初始化是必须的吗?不初始化会怎样?

    这个问题很重要!实际上前面讲那么多,其中有一个很重要的目的就是为了讲这个知识点.所谓初始化就是"第一次赋值"的意思.我们先来看一个程序: #include <stdio.h& ...

  6. static 变量初始化顺序的问题和解决方案

    http://www.cppblog.com/yindf/archive/2009/03/20/77304.aspx 最近在coding的时候,写了这么一段代码: A.h 1// A.h 2#incl ...

  7. 读书笔记_代码大全2第十章_变量初始化

    变量初始化原则 声明变量的同时初始化. 在靠近变量第一次使用的位置初始化(就近原则). 最好在靠近变量第一次使用的位置声明和定义变量. 在可能的情况下使用final或const(可以防止变量在初始化之 ...

  8. python变量初始化_tensorflow之变量初始化(tf.Variable)使用详解

    默认本系列的的读者已经初步熟悉tensorflow. 我们通过tf.Variable构造一个variable添加进图中,Variable()构造函数需要变量的初始值(是一个任意类型.任意形状的tens ...

  9. java 成员变量的初始化_Java类变量和成员变量初始化过程

    一.类的初始化 对于类的初始化:类的初始化一般只初始化一次,类的初始化主要是初始化静态成员变量. 类的编译决定了类的初始化过程. 编译器生成的class文件主要对定义在源文件中的类进行了如下的更改: ...

最新文章

  1. C++标准库math
  2. EdgeGallery — MEP — 系统架构
  3. python简单代码 春节集五福-我用 Python 集齐了五福
  4. Linux系统故障修复-MBR损坏,grub.conf配置文件丢失
  5. 一台计算机只能安装一块网络接口卡,为什么用路由上网,只有一台电脑可以上去?...
  6. org.springframework.beans.factory.BeanDefinitionStoreExcept
  7. 微服务升级优点_微服务–——定义, 原则 和 优点
  8. UVA10010 Where's Waldorf?【水题】
  9. iphone各机型参数对比_「科技美学」又是一年“双十一”,畅销机型有哪些?
  10. 大数据质量管理策略有哪些
  11. 传微软PK谷歌 将于2014年推出智能眼镜
  12. java中递归算法_java中递归算法是什么怎么算的?
  13. cad图形如何导入到奥维地图_CAD图导入奥维简易操作步骤--陈浩
  14. 关于AutoCAD软件的PDF打印机的问题
  15. 未来20年内,无人驾驶将颠覆这33大行业
  16. ChucK初步(8)
  17. 【mysql】mysql 导出全库表结构,并排除指定库
  18. dataframe更改columns
  19. 中小型服装店如何选择管理软件?
  20. oracle 基础语法(二)

热门文章

  1. 向spark standalone集群提交任务
  2. pyspark pipline
  3. html画线需要适应不同屏幕,hr标签不止创建html水平线也可以画圆噢
  4. linux 编程博客,Linux系统编程博客参考
  5. tensorflow就该这么学--3
  6. 文巾解题1588. 所有奇数长度子数组的和
  7. 地图自定义编码CSV转换成ini文件
  8. 最优化基础和机器学习优化
  9. 多变量线性回归程序实现
  10. Python入门100题 | 第060题