Android源码分析之Glide源码分析&基础版ImageLoader框架

来源:互联网 发布:sql删除表中一行 编辑:程序博客网 时间:2024/06/07 20:48

1 Glide源码分析

  Glide是一款由Bump Technologies开发的图片加载框架,使得我们可以在Android平台上以极度简单的方式加载和展示图片。本博客基于Glide 3.7.0版本来进行讲解,这个版本的Glide相当成熟和稳定。

1.1 时序图

(1)Glide框架时序图-加载网络图片
这里写图片描述
下载链接:Glide框架时序图-加载网络图片

(2)Glide框架时序图-加载网络图片
这里写图片描述
下载链接:Glide框架时序图-加载缓存图片

1.2 参考博客

Android图片加载框架最全解析(一),Glide的基本用法
Android图片加载框架最全解析(二),从源码的角度理解Glide的执行流程
Android图片加载框架最全解析(三),深入探究Glide的缓存机制
Android图片加载框架最全解析(四),玩转Glide的回调与监听
Android图片加载框架最全解析(五),Glide强大的图片变换功能
Android图片加载框架最全解析(六),探究Glide的自定义模块功能
Android图片加载框架最全解析(七),实现带进度的Glide图片加载功能
Android图片加载框架最全解析(八),带你全面了解Glide 4的用法

2 基础版ImageLoader框架

1 介绍

  花了2周的晚上和周末,学习了MrSimp1e老师的教你写Android ImageLoader框架,能够在一个稍微简单但功能齐全的框架基础上,深入了解实现的同时学到知识,也能够体会到在设计一个开源库时应该要做哪些考虑、做哪些取舍、有什么模式,了解一些开源库的设计基本原则。当然在了解了ImageLoader的实现之后再去使用专业的开源库,例如:Glide,也会更加的得心应手,出现问题的时候自己也能够不太费力地去究其原因。因此,经过分析后,我决定把此框架加入到我的CodeLibs公共库中。

2 使用方法

(1)在 gradle 中引入:

compile 'com.guan.codelibs:imageloader:1.0.0'

(2)example

public class MainActivity extends AppCompatActivity {    private SimpleImageLoader imageLoader;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.list);        GridView listview = (GridView) findViewById(R.id.listview);        listview.setAdapter(new MyAdapter(this));        //配置        ImageLoaderConfig.Builder builder = new ImageLoaderConfig.Builder();        ImageLoaderConfig config = builder.setThreadCount(3) //线程数量                .setLoadPolicy(new ReversePolicy()) //加载策略                .setCachePolicy(new DoubleCache(this)) //缓存策略                .setLoadingImage(R.drawable.loading)                .setFaildImage(R.drawable.not_found)                .build();        //初始化        imageLoader = SimpleImageLoader.getInstance(config);    }    private class MyAdapter extends BaseAdapter {        private LayoutInflater inflater;        MyAdapter(Context context) {            inflater = LayoutInflater.from(context);        }        @Override        public int getCount() {            return imageThumbUrls.length;        }        @Override        public Object getItem(int position) {            return imageThumbUrls[position];        }        @Override        public long getItemId(int position) {            return position;        }        @Override        public View getView(int position, View convertView, ViewGroup parent) {            View item = inflater.inflate(R.layout.item, null);            ImageView imageView = (ImageView) item.findViewById(R.id.iv);            //请求图片            imageLoader.displayImage(imageView, imageThumbUrls[position]);            return item;        }    }    public final static String[] imageThumbUrls = new String[]{         "http://img.my.csdn.net/uploads/201407/26/1406383299_1976.jpg",         "http://img.my.csdn.net/uploads/201407/26/1406383291_6518.jpg",           "http://img.my.csdn.net/uploads/201407/26/1406383291_8239.jpg",       "http://img.my.csdn.net/uploads/201407/26/1406383290_9329.jpg",//DB123421AC          "http://img.my.csdn.net/uploads/201407/26/1406383290_1042.jpg",       "http://img.my.csdn.net/uploads/201407/26/1406383275_3977.jpg", "http://img.my.csdn.net/uploads/201407/26/1406383265_8550.jpg",        "http://img.my.csdn.net/uploads/201407/26/1406383264_3954.jpg",         "http://img.my.csdn.net/uploads/201407/26/1406383264_4787.jpg",          "http://img.my.csdn.net/uploads/201407/26/1406383264_8243.jpg",        "http://img.my.csdn.net/uploads/201407/26/1406383248_3693.jpg",           "http://img.my.csdn.net/uploads/201407/26/1406383243_5120.jpg",          "http://img.my.csdn.net/uploads/201407/26/1406383242_3127.jpg","http://img.my.csdn.net/uploads/201407/26/1406383242_9576.jpg",         "http://img.my.csdn.net/uploads/201407/26/1406383242_1721.jpg",         "http://img.my.csdn.net/uploads/201407/26/1406383219_5806.jpg",        "http://img.my.csdn.net/uploads/201407/26/1406383214_7794.jpg",        "http://img.my.csdn.net/uploads/201407/26/1406383213_4418.jpg",         "http://img.my.csdn.net/uploads/201407/26/1406383213_3557.jpg",        "http://img.my.csdn.net/uploads/201407/26/1406383210_8779.jpg",        "http://img.my.csdn.net/uploads/201407/26/1406383172_4577.jpg",        "http://img.my.csdn.net/uploads/201407/26/1406383166_3407.jpg",         "http://img.my.csdn.net/uploads/201407/26/1406383166_2224.jpg",           "http://img.my.csdn.net/uploads/201407/26/1406383166_7301.jpg",        "http://img.my.csdn.net/uploads/201407/26/1406383165_7197.jpg",         "http://img.my.csdn.net/uploads/201407/26/1406383150_8410.jpg",        "http://img.my.csdn.net/uploads/201407/26/1406383131_3736.jpg",        "http://img.my.csdn.net/uploads/201407/26/1406383130_5094.jpg",          "http://img.my.csdn.net/uploads/201407/26/1406383130_7393.jpg",        "http://img.my.csdn.net/uploads/201407/26/1406383129_8813.jpg",           "http://img.my.csdn.net/uploads/201407/26/1406383100_3554.jpg",        "http://img.my.csdn.net/uploads/201407/26/1406383093_7894.jpg",        "http://img.my.csdn.net/uploads/201407/26/1406383092_2432.jpg",        "http://img.my.csdn.net/uploads/201407/26/1406383092_3071.jpg",        "http://img.my.csdn.net/uploads/201407/26/1406383091_3119.jpg",         "http://img.my.csdn.net/uploads/201407/26/1406383059_6589.jpg",        "http://img.my.csdn.net/uploads/201407/26/1406383059_8814.jpg",        "http://img.my.csdn.net/uploads/201407/26/1406383059_2237.jpg",       "http://img.my.csdn.net/uploads/201407/26/1406383058_4330.jpg",       "http://img.my.csdn.net/uploads/201407/26/1406383038_3602.jpg",        "http://img.my.csdn.net/uploads/201407/26/1406382942_3079.jpg",        "http://img.my.csdn.net/uploads/201407/26/1406382942_8125.jpg",         "http://img.my.csdn.net/uploads/201407/26/1406382942_4881.jpg",        "http://img.my.csdn.net/uploads/201407/26/1406382941_4559.jpg",        "http://img.my.csdn.net/uploads/201407/26/1406382941_3845.jpg",        "http://img.my.csdn.net/uploads/201407/26/1406382924_8955.jpg",        "http://img.my.csdn.net/uploads/201407/26/1406382923_2141.jpg",      "http://img.my.csdn.net/uploads/201407/26/1406382923_8437.jpg",       "http://img.my.csdn.net/uploads/201407/26/1406382922_6166.jpg",       "http://img.my.csdn.net/uploads/201407/26/1406382922_4843.jpg",       "http://img.my.csdn.net/uploads/201407/26/1406382905_5804.jpg",          "http://img.my.csdn.net/uploads/201407/26/1406382904_3362.jpg",           "http://img.my.csdn.net/uploads/201407/26/1406382904_2312.jpg",      "http://img.my.csdn.net/uploads/201407/26/1406382904_4960.jpg",      "http://img.my.csdn.net/uploads/201407/26/1406382900_2418.jpg",       "http://img.my.csdn.net/uploads/201407/26/1406382881_4490.jpg",          "http://img.my.csdn.net/uploads/201407/26/1406382881_5935.jpg",       "http://img.my.csdn.net/uploads/201407/26/1406382880_3865.jpg",       "http://img.my.csdn.net/uploads/201407/26/1406382880_4662.jpg",       "http://img.my.csdn.net/uploads/201407/26/1406382879_2553.jpg",       "http://img.my.csdn.net/uploads/201407/26/1406382862_5375.jpg",       "http://img.my.csdn.net/uploads/201407/26/1406382862_1748.jpg",       "http://img.my.csdn.net/uploads/201407/26/1406382861_7618.jpg",     "http://img.my.csdn.net/uploads/201407/26/1406382861_8606.jpg",       "http://img.my.csdn.net/uploads/201407/26/1406382861_8949.jpg",     "http://img.my.csdn.net/uploads/201407/26/1406382841_9821.jpg",      "http://img.my.csdn.net/uploads/201407/26/1406382840_6603.jpg",     "http://img.my.csdn.net/uploads/201407/26/1406382840_2405.jpg",     "http://img.my.csdn.net/uploads/201407/26/1406382840_6354.jpg",       "http://img.my.csdn.net/uploads/201407/26/1406382839_5779.jpg",      "http://img.my.csdn.net/uploads/201407/26/1406382810_7578.jpg",         "http://img.my.csdn.net/uploads/201407/26/1406382810_2436.jpg",        "http://img.my.csdn.net/uploads/201407/26/1406382809_3883.jpg",     "http://img.my.csdn.net/uploads/201407/26/1406382809_6269.jpg",      "http://img.my.csdn.net/uploads/201407/26/1406382808_4179.jpg",        "http://img.my.csdn.net/uploads/201407/26/1406382790_8326.jpg",         "http://img.my.csdn.net/uploads/201407/26/1406382789_7174.jpg",      "http://img.my.csdn.net/uploads/201407/26/1406382789_5170.jpg",      "http://img.my.csdn.net/uploads/201407/26/1406382789_4118.jpg",      "http://img.my.csdn.net/uploads/201407/26/1406382788_9532.jpg",       "http://img.my.csdn.net/uploads/201407/26/1406382767_3184.jpg",     "http://img.my.csdn.net/uploads/201407/26/1406382767_4772.jpg",       "http://img.my.csdn.net/uploads/201407/26/1406382766_4924.jpg",           "http://img.my.csdn.net/uploads/201407/26/1406382766_5762.jpg",    "http://img.my.csdn.net/uploads/201407/26/1406382765_7341.jpg"};}

(3)效果图
这里写图片描述

3 源码地址

github项目地址:CodeLibs/lib-imageloader/

4 分析

(2)基本架构图分析
这里写图片描述
图来源于:教你写Android ImageLoader框架之基本架构
(2)框架图分析
这里写图片描述
(3)UML图分析
这里写图片描述
(4)时序图分析
由于篇幅较大,请需要的小伙伴下载文件:imageloader框架时序图分析

5 使用到的知识点

  • 内存缓存 LruCache技术
  • 硬盘缓存技术DiskLruCache技术
  • 图片下载时请求转发
  • 生产者–消费者模式
  • 建造者模式
  • 单例模式
  • 模板方法模式
  • 策略模式—LoadMannger–UrlLoader\LocalLoader\NullLoader

6 学习链接

彻底解析Android缓存机制——LruCache

Android DiskLruCache完全解析,硬盘缓存的最佳方案

LinkedHashMap源码剖析

Android高效加载大图、多图解决方案,有效避免程序OOM