前言
- 最近要把一直用的Picasso替换成glide,因此笔者网上搜索了一下相关资源,顺带连源码也一块儿下下来看看。
- 先记录一些我浏览过觉得还挺不错的关于glide使用介绍和技巧的帖子吧。
- Glide的with(context)的选择
http://stackoverflow.com/questions/31964737/glide-image-loading-with-application-context/32887693#32887693 - UIL,Picasso,Glide,Fresco,Volley-ImageLoader对比:
http://stackoverflow.com/questions/29363321/picasso-v-s-imageloader-v-s-fresco-vs-glide - Glide使用技巧,如列表加载,列表滚动复用
http://www.jianshu.com/p/4a3177b57949 - Glide对下载下来的图片二次裁剪\渲染\着色处理-开源库:
https://github.com/cxMax/GlidePalette
https://github.com/cxMax/glide-transformations - glide的使用介绍
https://inthecheesefactory.com/blog/get-to-know-glide-recommended-by-google/en - Glide源码分析:
http://www.lightskystreet.com/2015/10/12/glide_source_analysis/
http://frodoking.github.io/2015/10/10/android-glide/
正文
- 设计图:
- 流程图:
- 类关系图:
源码分析
注:这里写得会比较乱
笔者看源码,有个习惯,喜欢按照他链式调用去一步一步向下看。
Glide类 : Glide.with(context).load(url).into(imageView);
1.ArrayPool,BitmapPool,BitmapPool 会在trimMemory的时候,释放资源,由此可见,可是哪个类肯定肯存储的图片相关,先放在这里,后面再细看。
2.Glide的初始化,跟Picasso类似,Glide的初始化也很有意思。Gilde内部是持有的context.getApplicationContext(),其参数是通过外部类GlideBuilder的createGlide()方法来初始化内部各个变量。然后在通过Glide()的构造函数,把初始化的变量传递回来。Glide内部是没有持有Context的,这种写法也避免了单例模式的常见的内存泄露写法。
3.同Picasso类似, Glide.with(context)返回的也是RequestManager,那我们将进行下一步看RequestManager这个类
3.Glide在使用介绍的时候,也特别说明了,相对于Picasso,Glide不会持有applicationcontext,会根据fragment,activity的context,进行图片加载、停止、暂停。因此在内存表现上,更优于Picasso,(使用Picasso会经常出现OOM的异常,不知道大家是否有遇到)。因此,这一点的实现,笔者也是比较好奇的。如何做掉持有context并对lifecycle进行回调的。因此我们也得去RequestManager这个类看一下实现。
RequestManager:
接上面的疑问,如何随生命周期进行回收\暂停?
1.Lifecycle : listening to Activity/Fragment lifecycle events. 绑定LifecycleListener生命周期回收监听事件。
2.LifecycleListener: void onStart(); void onStop(); void onDestroy();
3.TargetTracker:内部持有一个weakRefereance,把目标target传递进去,然后调用对应LifecycleListener的方法。
4.RequestManager内部通过track和untrack的方法对目标target的生命周期进行绑定。具体执行绑定的代码在构造Glide的时候,亦就是GlideBuilder里面就进行了track进行target的绑定
/————————-分割线———————————–/
2017年1月17日
根据glide生命周期,学着撸了一个库,对于异步持有的context防内存泄漏的代码,有着很好的监听和做对应的释放操作,类似于RxLifecycle。
https://github.com/cxMax/LifeCycler