深入解析开源项目之Universal-Image-Loader(二)缓存篇

珍惜作者劳动成果,如需转载,请注明出处。 
http://blog.csdn.net/zhengzechuan91/article/details/50292871

Universal-Image-Loader 是一个优秀的图片加载开源项目,Github地址在 (Github地址) ,很多童鞋都在自己的项目中用到了。优秀的项目从来都是把简单留给开发者,把复杂封装在框架内部。ImageLoader作为Github上Star数过万的项目,备受开发者青睐,所以我们有必要搞清楚它的内部实现。

在上一篇博客中我们分析了ImageLoader框架的整体实现原理,还没有看过的直接到 深入解析开源项目之ImageLoader(一)框架篇 。


ImageLoader之内存缓存篇

由上图我们可以看出:

1.MemoryCache接口定义了Bitmap缓存相关操作;

public interface MemoryCache {

    boolean put(String key, Bitmap value);

    Bitmap get(String key);

    Bitmap remove(String key);

    Collection<String> keys();

    void clear();
   }

2.抽象类BaseMemoryCache中则使用HashMap保存了Bitmap的软/弱引用;

public abstract class BaseMemoryCache implements MemoryCache {

    private final Map<String, Reference<Bitmap>> softMap = Collections.synchronizedMap(new HashMap<String, Reference<Bitmap>>());

    @Override
    public Bitmap get(String key) {
        Bitmap result = null;
        Reference<Bitmap> reference = softMap.get(key);
        if (reference != null) {
            result = reference.get();
        }
        return result;
    }

    @Override
    public boolean put(String key, Bitmap value) {
        softMap.put(key, createReference(value));
        return true;
    }

    @Override
    public Bitmap remove(String key) {
        Reference<Bitmap> bmpRef = softMap.remove(key);
        return bmpRef == null ? null : bmpRef.get();
    }

    @Override
    public Collection<String> keys() {
        synchronized (softMap) {    //拿到softMap锁就可以读的时候不写
            return new HashSet<String>(softMap.keySet());
        }
    }

    @Override
    public void clear() {
        softMap.clear();
    }

    protected abstract Reference<Bitmap> createReference(Bitmap value);
}

对图片bitmap创建软应用的实现:

WeakMemoryCache,FIFOLimitedMemoryCache,LargestLimitedMemoryCache,LRULimitedMemoryCache,UsingFreqLimitedMemoryCache的实现一样

public class WeakMemoryCache extends BaseMemoryCache {
    @Override
    protected Reference<Bitmap> createReference(Bitmap value) {
        return new WeakReference<Bitmap>(value);
    }
}

LimitedMemoryCache并没有实现createReference方法,所以是一个抽象类。

时间: 2024-10-12 07:55:30

深入解析开源项目之Universal-Image-Loader(二)缓存篇的相关文章

开源项目PullToRefresh详解(二)——PullToRefreshGridView

这里介绍的是PullToRefreshGridView的使用方法,和之前的PullToRefreshListView方法如出一辙,因为这个开源项目模块化很棒,所以很容易实现.等于说我们可以按照之前使用控件的方式来操作,不用考虑其他的问题. 思路: 1.写布局文件,放入可以下拉刷新的控件 2.找到下拉刷新的控件,设置监听器,并且在刷新方法中开启一个异步任务来操作 3.通过这个下拉刷新控件的getRefreshableView()方法来得到GridView对象,按照正常的操作来设置适配器 4.在异步

开源项目MultiChoiceAdapter详解(二)——MultiChoiceArrayAdapter的使用

MultiChoiceArrayAdapter其实就是可以多选的ArrayAdapter了,ArrayAdpter我们已经很熟悉了.MultiChoiceArrayAdapter这个类是抽象类,所以使用前必须要继承.下面是使用MultiChoiceArrayAdapter的步骤: 0.用自定义的控件来写一个layout 1.写一个类来继承MultiChoiceArrayAdapter 2.实例化这个类 3.用setAdapterView()来设置要加载适配器的控件. 4.写上保存的方法 @Ove

开源项目MultiChoiceAdapter详解(五)——可扩展的MultiChoiceBaseAdapter

上次写到了开源项目MultiChoiceAdapter详解(四)——MultiChoiceBaseAdapter的使用,其实我们仍旧可以不使用ActionMode的,所以这里就写一个自己扩展的方法. 一.布局文件 listview_normal_layout.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.andr

开源项目MultiChoiceAdapter详解(六)——GridView和MultiChoiceBaseAdapter配合使用

这篇其实没啥重要的,主要就算是个总结吧. 一. 这里实现的是类似于上图的多图选择的效果.关键在于item布局文件的写法.这也就是这个框架奇葩的一点,莫名其妙的要在一个自定义控件里面再放一个自定义的控件,如果不这样就出不了选中的效果.分析下原因是这里整个item被图片所覆盖了,仅仅设置一个有选择效果的父控件会被图片所覆盖,所以还得用一个可以选中的iamgeview进行替换imageview. 下面就是这个布局文件 item_gridview.xml <?xml version="1.0&qu

.NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验

不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家介绍.NET平台下的文档型数据库RavenDB,虽然我以前也在小项目用过其他文档型数据库,但问题很多,小项目还可以,大项目就歇菜了.这个数据库我关注了很久,最近一直在看它的文档,所以把知道的先总结下来. .NET开源目录:[目录]本博客其他.NET开源项目文章目录 本文原文地址:http://www

android常用的开源项目推荐

1.图片加载:imageLoader 是个非常不错的图片加载控件,能异步流畅的加载大量图片. Github地址:https://github.com/nostra13/Android-Universal-Image-Loader 2.侧边栏:slidingmenu 非常方便的侧边栏控件,功能齐全,效果也不错. Github地址:https://github.com/jfeinstein10/SlidingMenu 3.网络访问:volley 简单易用的网络通信框架,适合数据量不大,但频繁通信的场

开源项目Universal Image Loader for Android 说明文档 (1) 简介

 When developing applications for Android, one often facesthe problem of displaying some graphical content from the Internet. So, youshould provide image loading from the Web in an Android app, their processingand displaying with limited memory aga

开源项目Universal Image Loader for Android 说明文档 (1) 简单介绍

 When developing applications for Android, one often facesthe problem of displaying some graphical content from the Internet. So, youshould provide image loading from the Web in an Android app, their processingand displaying with limited memory aga

Android 开源项目源码解析(第二期)

Android 开源项目源码解析(第二期) 阅读目录 android-Ultra-Pull-To-Refresh 源码解析 DynamicLoadApk 源码解析 NineOldAnimations 源码解析 SlidingMenu 源码解析 Cling 源码解析 BaseAdapterHelper 源码分析 Side Menu.Android 源码解析 DiscreteSeekBar 源码解析 CalendarListView 源码解析 PagerSlidingTabStrip 源码解析 公共