Android Glide(二)生命周期感知

Glide的生命周期管理

主要分为三个层次的生命周期:Activity & 网络 & 内存。
我们一般认为,应该及时取消不必要的加载请求,这很耗费资源,但在Glide这并不是必须的操作。因为 Glide 会在页面生命周期 / 网络变化时,自动取消加载或重新加载。没错,就是这么牛逼。

  • 页面生命周期
    当页面不可见时暂停请求;页面可见时恢复请求;页面销毁时销毁请求。
  • 网络连接状态
    如果从 URL 加载图片,Glide 会监听设备的连接状态,并在重新连接到网络时重启之前失败的请求。
  • 内存状态
    Glide 会监听内存状态,并根据不同的 level 来释放内存。
    为什么要监听页面生命周期?
    主要基于以下两个目的:
  • 以确保优先处理前台可见的 Activity / Fragment,提高资源利用率;
  • 在有必要时释放资源以避免在应用在后台时被杀死,提高稳定性。

三种生命周期作用域

还记得Glide使用的第一句吗,Glide.with(参数),
with()方法可以接收Context、Activity或者Fragment类型的参数。


image.png

先说结论,根据传入的参数不同,将对应于 Application & Activity & Fragment 的作用域,具体如下:


image.png

这里不细节分析源码实现,我们只需要知道,不同参数通过重载方法,作用于不同的作用域

生命周期绑定

  • 1、从 FragmentManager 中获取 SupportRequestManagerFragment;

  • 2、从该 Fragment 中获取 RequestManager;

  • 3、首次获取,则实例化 RequestManager,后续从同一个 SupportRequestManagerFragment 中都获取的是这个 RequestManager。
    不拘泥于细节,关键在于SupportRequestManagerFragment
    其实就是三步走战略。

  • 1.1 尝试获取FRAGMENT_TAG对应的 Fragment

  • 1.2 尝试从临时记录中获取 Fragment

  • 1.3 实例化 Fragment

    • 1.3.1 创建对象
    • 1.3.2 如果父层可见,则调用 onStart() 生命周期
    • 1.3.3 临时记录映射关系(HashMap)
    • 1.3.4 提交 Fragment 事务
    • 1.3.5 post 一个消息
    • 1.3.6 移除临时记录中的映射关系

这里具体分析一下上面这些晦涩的语句,注意设计的思路重点,就是这个SupportRequestManagerFragment,这个隐藏SupportRequestManagerFragment,这个并不可见的SupportRequestManagerFragment。

这里为什么要添加一个隐藏的Fragment呢?

Glide并没有办法知道Activity的生命周期,于是Glide就使用了添加隐藏Fragment的这种小技巧,相当于通过这个隐藏的fragment与对应的Activity建立了联系,因为Fragment的生命周期和Activity是同步的,如果Activity被销毁了,Fragment是可以监听到的,这样Glide就可以捕获这个事件并停止图片加载了。

这里又有一个设计点,临时记录,它是为了干什么呢?

在提交 Fragment 事务之前,为什么需要先保存记录?

这是 为了避免 SupportRequestManagerFragment 在一个作用域中重复创建。
因为commitAllowingStateLoss()是将事务 post 到消息队列中的,也就是说,事务是异步处理的,而不是同步处理的。假设没有临时保存记录,一旦在事务异步等待执行时调用了Glide.with(...),就会在该作用域中重复创建 Fragment。


image.png

生命周期监听

从上面的分析我们得知,Glide 为每个Activity 和 Fragment 作用域创建了一个无界面的 Fragment,这里我们就来分析 Glide 如何监听这个无界面 Fragment 的生命周期。
首先先提到一个概念,Lifecycle,大家可以粗略的把它理解为 移动APP页面的状态
其实说起来也是三步走战略,
1、在创建Fragment的时候会创建ActivityFragmentLifecycle对象;
2、在Fragment生命周期的方法中会调用Lifecycle的相关方法来通知RequestManager;
3、LifecycleListener 是一个接口,RequestManager实现了这个接口,Lifecycle最终是调用了lifecycleListener来通知相关的实现类的,也就是RequestManager。

生命周期回调

这个就非常简单了,也就是上述的RequestManager实现了LifecycleListener接口后,在对应的方法中,作出相应的处理。
主要关注以下几点:

  • 1、页面不可见时暂停请求(onStop() )
  • 2、页面可见时恢复请求(onStart() )
  • 3、页面销毁时销毁请求(onDestroy() )


    image.png

网络连接状态监听

这个逻辑很简单,在刚才所说的RequestManager的构造器中,会构建一个ConnectivityMonitor对象,它的默认构造工厂是DefaultConnectivityMonitorFactory,如果有网络监听权限,
则实例化DefaultConnectivityMonitor,在onStart()时注册广播监听器,而在onStop()时注销广播监听器。在RequestManager中根据网络状态进行相应的操作。

听起来有点拗口,简而言之,如果应用有监控网络状态的权限,那么 Glide 会监听网络连接状态,在页面可见时注册广播监听器,而在页面不可见时注销广播监听器,并在网络重新连接时重新启动失败的请求。

内存状态监听

这个的实现也非常简单的的,在构建 Glide 时,会调用registerComponentCallbacks()进行全局注册, 系统在内存紧张的时候回调onTrimMemory(level)。
而 Glide 则根据系统内存紧张级别(level)进行相应的回收,而 RequestManager 在 TRIM_MEMORY_MODERATE 级别会暂停请求。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容