Glide使用生命周期对图片进行管理,根据Glide的使用方法我们可以看出,传入的context建议传入Activity或Fragment,因为传入这两者可以根据Activity或Fragment的生命周期对图片进行管理,比如在Paused状态暂停加载,在Resumed的时候又自动重新加载。所以我建议传参的时候传递Activity 和 Fragment给Glide,而不是Context。
Glide.with(context)
.load("http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg")
.into(ivImg);
那么Glide是如何利用传入的Frgament或Activity对生命周期进行管理呢?
先一步一步看吧,当你调用Glide.with()方法的时候,传入了Activity或者Fragment对象,然后根据它获取到FragmentManager,然后再根据这个FragmentManager会去生成一个RequestManagerFragment,RequestManagerFragment就是Glide管理图片生命周期的法宝,Fragment里面有onStart() onStop() 和onDestroy()的生命周期方法。在这个再去回调RequestManager里面的方法,就起到了,自动控制图片加载还是暂停的目的。
举个例子,如果Glide.with()传入的是Activity,那么当Activity执行到onStop()生命周期(比如跳转到其他页面去了)的时候,应该是不需要加载图片了。就会影响到该Activity旗下的Fragment也就是RequestManagerFragment,回调它的onStop(),它又会回调RequestManager的onStop()方法,接着就把没有加载完成的图片给暂停掉了。
1.Glide默认加载Bitmap的时候会使用RGB_565格式,而Picasso会默认使用ARGB8888格式,这样的话,Glide比Picasso的内存开销要小一半,但是清晰度会低于Picasso,不过可以设置一个GlideMoudle将加载出来的RGB_565格式转为ARGB8888格式,这样虽然会增加Glide消耗的内存(大概两倍),不过仍然还是远低于Picasso消耗的内存的。
2.加载图片的时候,Picasso默认会加载全尺寸的图片,而Glide会根据需要填充的View的大小来决定需要加载图片的尺寸,因此消耗的内存更少。不过Picasso也可以指定加载图片的尺寸,不过需要多一步计算,当计算完成后两者消耗内存接近,不过相比之下还是Glide效率更高,因为它会自动计算出任意情况下的ImageView的尺寸。
3.磁盘缓存方面: Picasso会缓存全尺寸的图片(只缓存一次,在需要的时候会取出然后调整大小再填充所以会比Glide慢),而Glide缓存的是跟ImageView尺寸相同的,而且加载的是RGB_565格式,缓存的就是该格式,不过Glide的缓存,不同尺寸会分别缓存一次,这样的话各个尺寸都会存在缓存,可以通过下面代码修改缓存方式:
Glide.with(this)
.load("http://nuuneoi.com/uploads/source/playstore/cover.jpg")
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(ivImgGlide);
下次在任何ImageView中加载图片的时候,全尺寸的图片将从缓存中取出,重新调整大小,然后缓存。
Glide的这种方式优点是加载显示非常快。而Picasso的方式则因为需要在显示之前重新调整大小而导致一些延迟,即使使用Picasso.noFade()让其立即显示。
4.Glide可以加载Gif图,而Picasso却不行,但是Glide加载Gif图的时候会消耗大量的内存,除了gif动画之外,Glide还可以将任何的本地视频解码成一张静态图片。
5.此外,Glide还可以配置图片显示的动画,而Picasso只有一种动画:fading in。
6.Glide和Picasso都是非常完美的库。Glide加载图像以及磁盘缓存的方式都要优于Picasso,速度更快,并且Glide更有利于减少OutOfMemoryError的发生,GIF动画是Glide的杀手锏。不过Picasso的图片质量更高,建议是使用Glide,但是将Bitmap格式换成 ARGB_8888、让Glide缓存同时缓存全尺寸和改变尺寸两种。