欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > > 内容正文

Android源码分析之简单版ImageLoader框架,androidimageloader,当然在了解了ImageL

来源: 开发者 投稿于  被查看 23013 次 评论:129

Android源码分析之简单版ImageLoader框架,androidimageloader,当然在了解了ImageL


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


作者:

陈李冠


用户评论