《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

发布了82 篇原创文章 · 获赞 3 · 访问量 7万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章