-
/** * 由于构造方法为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
提交
取消