Glide和Picasso都是图片加载框架,用法相似:

//Glide的用法
Glide.with(context).load(url).into(imageView);
//Picasso的用法
Picasso.with(context).load(url).into(imageView);

不同的地方,也是Glide的优点

  1. with()方法里面的参数可以是Context、Activity、Fragment,并且后面两个参数类型可以使这个图片和后面连个参数的生命周期绑定
  2. Bitmap的默认格式是RGB_565,所以是Glide的默认格式,而Picasso的默认格式是ARGB_8888,这个格式的图片质量高于前者,但是内存开销较大。
  3. Picasso和Glide在磁盘缓存策略上有很大的不同,Picasso缓存的是全尺寸的,而Glide缓存的是跟ImageView尺寸相同的,也就是说如果将ImageView调整成不同大小,Picasso都只缓存一个全尺寸的,而Glide则不同,它会为每种大小的ImageView缓存一次。所以如果一张图片已经缓存了一次,但是假如要在另外一个地方再次以不同尺寸显示,需要重新下载,调整成新尺寸的大小,然后将这个尺寸的也缓存起来(不过可以在里面设置,使得每次加载不同大小的都放进内存,下次在加载的时候就可以直接在内存里面取得)。
  4. 特别的,Glide还能加载GIF动态图,可以和生命周期绑定,使动态图随生命周期的变化而变化。

两者缺点

  1. Picasso每次加载的都是全尺寸图片,导致内存开销大,当然这个和他的格式为ARGB_8888有关,不过就算是Glide也是ARGB_8888内存开销也比Picasso小得多

    /**
    **  将Glide中Bitmap的格式改为ARGB_8888
    //第一步:创建一个新的GlideModule将Bitmap格式转换到ARGB_8888
    public class GlideConfiguration implements GlideModule {
        @Override
        public void applyOptions(Context context, GlideBuilder builder) {
            // Apply options to the builder here.
            builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
        @Override
        public void registerComponents(Context context, Glide glide) {
            // register ModelLoaders here.
    //第二步:同时在AndroidManifest.xml中将GlideModule定义为meta-data
    <meta-data android:name="com.inthecheesefactory.lab.glidepicasso.GlideConfiguration" android:value="GlideModule"/>
    
  2. Glide由于在每次加载不同大小的图片时,都是重新下载,而为了解决这种性能问题,选择将每次下载的图片都放入磁盘,但是也就造成了占用更大的空间。

缓存Glide加载的图片到本地

Glide提供了一个downloadOnly() 接口来获取缓存的图片文件,但是前提必须要设置diskCacheStrategy方法的缓存策略为DiskCacheStrategy.ALL或者DiskCacheStrategy.SOURCE,还有downloadOnly()方法需要在线程里进行。

private class getImageCacheAsyncTask extends AsyncTask<String, Void, File> {
        private final Context context;
        public getImageCacheAsyncTask(Context context) {
            this.context = context;
        @Override
        protected File doInBackground(String... params) {
            String imgUrl =  params[0];
            try {
                return Glide.with(context)
                        .load(imgUrl)
                        .downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
                        .get();
            } catch (Exception ex) {
                return null;
        @Override
        protected void onPostExecute(File result) {
            if (result == null) {
                return;
            //此path就是对应文件的缓存路径
            String path = result.getPath();
            Log.e("path", path);
            Bitmap bmp= BitmapFactory.decodeFile(path);
            img.setImageBitmap(bmp);

Glide的缓存机制

一般在做图片的缓存的时候都要考虑到内存泄漏的问题,使用内存缓存技术可以很好的解决这个问题,它可以让组件快速地重新加载和处理图片,内存缓存技术对那些大量占用应用程序宝贵内存的图片提供了快速访问的方法。其中最核心的类是LruCache它的主要算法原理是把最近使用的对象用强引用存储在 LinkedHashMap 中,并且把最近最少使用的对象在缓存值达到预设定值之前从内存中移除,当向 ImageView 中加载一张图片时,首先会在 LruCache 的缓存中进行检查。如果找到了相应的键值,则会立刻更新ImageView ,否则开启一个后台线程来加载这张图片,BitmapWorkerTask 还要把新加载的图片的键值对放到缓存中。

在Glide框架里面的缓存

Glide缓存分为 内存缓存硬盘缓存
这两个缓存模块的作用各不相同,内存缓存 的主要作用是防止应用重复将图片数据读取到内存当中,而 硬盘缓存 的主要作用是防止应用重复从网络或其他地方重复下载和读取数据。