应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

字节跳动一面之Glide生命周期管理面试总结

  本文通过在字节面试遇到的问题总结而出,如有不对的地方,请及时批评指正。篇幅较长,请耐心阅读。如果您想了解其他框架源码,欢迎评论区留言!
  篇幅较长,请耐心阅读〔玫瑰〕
  简介
  Glide是一个优秀的图片加载框架,支持多种数据源,功能强大,性能高。如图所示:
  使用步骤
  1。在build。gradle中添加glide引用implementationcom。github。bumptech。glide:glide:4。12。0
  2。使用glide加载图片Glide。with(this)。load(BASEPICURL)。into(imguser)源码分析设计模式1。单例模式
  Glide使用了单例设计模式,通过双重校验锁机制不仅保证了Glide对象的全局单例,而且解决了多线程环境下的并发安全问题。2。工厂设计模式
  Glide内部的创建RequestManager对象时使用了工厂设计模式,通过定义RequestManagerFactory抽象接口,让其子类创建RequestManager对象,隐藏其内部创建逻辑。3。建造者设计模式
  Glide使用了静态类GlideBuilder构建Glide对象,将Glide的各种属性封装到GlideBuilder中,根据不同的属性设置构建不同功能的Glide对象。简化Glide的构建过程。生命周期绑定主线程中使用
  1。Glide使用With方法传入所需要的上下文,主线程中一般传context,fragment,activity来实现对生命周期的绑定。publicstaticRequestManagerwith(NonNullContextcontext)publicstaticRequestManagerwith(NonNullActivityactivity)publicstaticRequestManagerwith(NonNullFragmentfragment)publicstaticRequestManagerwith(NonNullFragmentActivityactivity)
  2。下面以activity为例,参数传入activity。publicstaticRequestManagerwith(NonNullActivityactivity){returngetRetriever(activity)。get(activity);}
  3。通过调用RequestManagerRetriever的get方法,传入activity参数返回RequestManager对象。RequestManager主要负责管理Glide的请求和启动。NonNullpublicRequestManagerget(NonNullActivityactivity){判断是否是后台线程if(Util。isOnBackgroundThread()){returnget(activity。getApplicationContext());}elseif(activityinstanceofFragmentActivity){returnget((FragmentActivity)activity);}else{判断当前activity没有被销毁,否则抛出异常assertNotDestroyed(activity);frameWaiter。registerSelf(activity);获取activity中的FragmentManagerandroid。app。FragmentManagerfmactivity。getFragmentManager();通过fragmentGet方法,创建并返回RequestManagerreturnfragmentGet(activity,fm,parentHintnull,isActivityVisible(activity));}}
  RequestManagerRetriever的get方法中根据传入的参数不同,使用Util。isOnBackgroundThread判断子线程和主线程分别进行不同的处理。主线程中最终都是调用fragmentGet方法。注意,由于这里的参数是activity,获取的是fragmentManager,如果传入的是fragment,则获取的childFragmentManager。
  4。fragmentGet方法主要是通过RequestManagerFragment来获取RequestManager,如果没有获取到,则通过工厂模式进行创建。同时传入fragment的getGlideLifecycle。这个lifecycle是重点,需要注意。privateRequestManagerfragmentGet(NonNullContextcontext,NonNullandroid。app。FragmentManagerfm,Nullableandroid。app。FragmentparentHint,booleanisParentVisible){通过fragmentManager获取RequestManagerFragmentRequestManagerFragmentcurrentgetRequestManagerFragment(fm,parentHint);获取RequestManagerFragment中的requestManagerRequestManagerrequestManagercurrent。getRequestManager();判断requestManagerif(requestManagernull){如果requestManager为空,则通过工厂设计模式创建出requestManagerGlideglideGlide。get(context);requestManagerfactory。build(glide,current。getGlideLifecycle(),current。getRequestManagerTreeNode(),context);如果activity显示出来,则执行requestManager的onStart方法if(isParentVisible){requestManager。onStart();}current。setRequestManager(requestManager);}returnrequestManager;}
  5。创建RequestManagerFragment,这里创建一个空白页面的RequestManagerFragment并且绑定到当前activity中。NonNullprivateRequestManagerFragmentgetRequestManagerFragment(NonNullfinalandroid。app。FragmentManagerfm,Nullableandroid。app。FragmentparentHint){通过tag获取fragmentManager中保存的fragmentRequestManagerFragmentcurrent(RequestManagerFragment)fm。findFragmentByTag(FRAGMENTTAG);if(currentnull){如果获取不到,则进一步通过pendingRequestManagerFragmentsMap中获取currentpendingRequestManagerFragments。get(fm);if(currentnull){如果还是获取不到,则进行创建currentnewRequestManagerFragment();current。setParentFragmentHint(parentHint);同时保存到map中pendingRequestManagerFragments。put(fm,current);然后添加到当前activity中fm。beginTransaction()。add(current,FRAGMENTTAG)。commitAllowingStateLoss();将这个添加动作通过handler发送给系统处理handler。obtainMessage(IDREMOVEFRAGMENTMANAGER,fm)。sendToTarget();}}returncurrent;}
  6。RequestManagerFragment的构造函数创建了ActivityFragmentLifecycle用来监听RequestManagerFragment的生命周期onStart(),onStop(),onDestroy()。publicSupportRequestManagerFragment(){this(newActivityFragmentLifecycle());}publicSupportRequestManagerFragment(NonNullActivityFragmentLifecyclelifecycle){this。lifecyclelifecycle;}OverridepublicvoidonStart(){super。onStart();lifecycle。onStart();}OverridepublicvoidonStop(){super。onStop();lifecycle。onStop();}OverridepublicvoidonDestroy(){super。onDestroy();lifecycle。onDestroy();}
  最后在fragmentGet方法中将ActivityFragmentLifecycle通过工厂设计模式传给RequestManager并返回。
  7。ActivityFragmentLifecycle继承于Lifecycle接口。OverridepublicvoidaddListener(NonNullLifecycleListenerlistener){所有的监听者都添加监听lifecycleListeners。add(listener);根据不同的生命周期进行处理if(isDestroyed){listener。onDestroy();}elseif(isStarted){listener。onStart();}else{listener。onStop();}}OverridepublicvoidremoveListener(NonNullLifecycleListenerlistener){移除所有监听lifecycleListeners。remove(listener);}voidonStart(){只添加一次监听isStartedtrue;同步所有生命周期for(LifecycleListenerlifecycleListener:Util。getSnapshot(lifecycleListeners)){lifecycleListener。onStart();}}voidonStop(){isStartedfalse;同步所有生命周期for(LifecycleListenerlifecycleListener:Util。getSnapshot(lifecycleListeners)){lifecycleListener。onStop();}}voidonDestroy(){isDestroyedtrue;同步所有生命周期for(LifecycleListenerlifecycleListener:Util。getSnapshot(lifecycleListeners)){lifecycleListener。onDestroy();}}
  8。RequestManager拿到这个lifecycle,进行绑定监听RequestManagerFragment生命周期。RequestManager(Glideglide,Lifecyclelifecycle,RequestManagerTreeNodetreeNode,RequestTrackerrequestTracker,ConnectivityMonitorFactoryfactory,Contextcontext){this。glideglide;this。lifecyclelifecycle;this。treeNodetreeNode;this。requestTrackerrequestTracker;this。contextcontext;。。)。。。。。。。。。。。。。。。。。。。。。。。。。。。判断是否是后台线程if(Util。isOnBackgroundThread()){Util。postOnUiThread(addSelfToLifecycle);}else{添加lifecycle监听lifecycle。addListener(this);}lifecycle。addListener(connectivityMonitor);。。。。。。。。。。。。。。}
  9。通过生命周期的绑定处理对应的业务逻辑和资源释放等功能。publicsynchronizedvoidonStart(){开始请求resumeRequests();targetTracker。onStart();}OverridepublicsynchronizedvoidonStop(){开始停止pauseRequests();targetTracker。onStop();}OverridepublicsynchronizedvoidonDestroy(){targetTracker。onDestroy();释放资源targetTracker。clear();requestTracker。clearRequests();lifecycle。removeListener(this);lifecycle。removeListener(connectivityMonitor);Util。removeCallbacksOnUiThread(addSelfToLifecycle);glide。unregisterRequestManager(this);}
  总结如下图所示:
  Glide在主线程中使用时,通过创建一个空白的fragment添加到当前ActivityFragment中,用来监听当前页面的生命周期变化,进行图片的显示或资源的释放。子线程中使用
  1。Glide在子线程中使用只能传入applicationContext。publicstaticRequestManagerwith(NonNullContextcontext)
  2。通过调用RequestManagerRetriever的get方法,传入activity参数返回RequestManager对象。RequestManager主要负责管理Glide的请求和启动。publicRequestManagerget(NonNullContextcontext){if(contextnull){thrownewIllegalArgumentException(YoucannotstartaloadonanullContext);}elseif(Util。isOnMainThread()!(contextinstanceofApplication)){if(contextinstanceofFragmentActivity){returnget((FragmentActivity)context);}elseif(contextinstanceofActivity){returnget((Activity)context);}elseif(contextinstanceofContextWrapper((ContextWrapper)context)。getBaseContext()。getApplicationContext()!null){returnget(((ContextWrapper)context)。getBaseContext());}}子线程返回applicationManagerreturngetApplicationManager(context);}
  3。在getApplicationManager方法中通过双重校验锁的单例方式返回applicationManager,applicationManager的创建使用了工厂设计模式,隐藏了applicationManager的内部创建细节。NonNullprivateRequestManagergetApplicationManager(NonNullContextcontext){if(applicationManagernull){synchronized(this){if(applicationManagernull){GlideglideGlide。get(context。getApplicationContext());applicationManagerfactory。build(glide,newApplicationLifecycle(),newEmptyRequestManagerTreeNode(),context。getApplicationContext());}}}returnapplicationManager;}
  4。getApplicationManager创建applicationManager时传入了ApplicationLifecycle作为生命周期监听。RequestManager(Glideglide,Lifecyclelifecycle,RequestManagerTreeNodetreeNode,RequestTrackerrequestTracker,ConnectivityMonitorFactoryfactory,Contextcontext){this。glideglide;this。lifecyclelifecycle;this。treeNodetreeNode;this。requestTrackerrequestTracker;this。contextcontext;。。。。。。。。。。。。。如果是子线程,通过使用Handler切换到主线程if(Util。isOnBackgroundThread()){Util。postOnUiThread(addSelfToLifecycle);}else{lifecycle。addListener(this);}。。。。。。。。。。。。。。。。}
  5。RequestManager拿到这个lifecycle,使用Handler切换到主线程进行绑定监听Application生命周期。privatefinalRunnableaddSelfToLifecyclenewRunnable(){Overridepublicvoidrun(){lifecycle。addListener(RequestManager。this);}};
  6。通过绑定Application的onStart()方法进行请求处理。publicsynchronizedvoidonStart(){开始请求resumeRequests();targetTracker。onStart();}
  总结如下图所示:
  当Glide在子线程中使用时,只需要监听application的onStart方法进行业务请求的处理,application销毁时,整个应用程序都会被销毁,Glide也会跟随着应用销毁而进行资源释放。所以在子线程中使用,由于传入的context是applicationContext,Glide的生命周期也会和整个应用程序一样。
  以上就是字节面试后总结的几个要点,还不会的同学赶紧学起来吧,感谢您的阅读,创造不易,如果您觉得本篇文章对您有帮助,请点击关注小编,您的支持就是小编创作的最大动力!

孩子缺乏敬畏之心的危害,小时候父母一定要教会他们规则意识你的孩子是否曾经顶撞过你呢?从012周岁的时候关键时期,孩子特别依耐环境的,如果父母做得不到位,也许孩子眼里根本没有敬畏之心。一个没有敬畏之心的人,长大后很难适应环境的,……三大国抨击美元霸权,美元霸权即将终结?美国将进入死循环最近随着俄土会的结束,几项成果正在逐渐让美元霸权的终结变成事实。今年以来,美国点火俄乌冲突,迫使普京在准备不充分的情况下开展特别军事行动。接下来,美国自以为是的对俄进行了一系列……2022年男排世锦赛26日揭幕,中国男排志在改写历史北京时间8月26日17时,由波兰和斯洛文尼亚联合举办的2022年世界男排锦标赛全面展开,最后决赛将于9月11日举行,中国男排将于北京时间8月27日17时在卢布尔雅那迎战欧洲劲旅……辽篮3消息!郭艾伦确定续约,02级国青后卫加盟,付豪落选大名今年夏天辽宁队又迎来一番调整,一般来说刚拿到冠军的球队会比较稳定,但他们却反其道而行之,反而会追求变化,除了保证核心阵容的强大,也要考虑培养出来更多的年轻人。这几天从官方注册信……卡福内马尔比梅西技术好太多!梅西球迷胡说八道名宿卡福在最近谈到巴黎队时表示,内马尔是巴西队中最好的球员,我们最大的偶像,我们的球星。技术上来说,内马尔无需讨论,他比C罗、梅西、德布劳内。。。。。。比任何球员都好,他比姆巴……精简护肤给皮肤做减法,给美丽做加法精简护肤是近几年非常盛行的护肤理念,它来源于日本极简主义的生活态度,本着断舍离的精神,对生活做减法,把身边不需要、不适合、不舒服的东西舍弃掉,身边的物品精简到最低,只留下最优质……湖北一避暑康养小镇全面采用石墨烯电采暖2800亩富硒康养圣地花硒谷位于湖北省建始县高坪镇,处于富硒矿带上,海拔1200米,四面环山,环境优美,空气清新,森林覆盖率达到85,负氧离子含量达到60000个cm,全……未发现第五种力科学家完成首个确定性暗能量理论实验检验抗磁悬浮力学系统实验系统中国科大供图中新网合肥8月26日电(记者吴兰)中国科学技术大学中科院微观磁共振重点实验室杜江峰院士团队与南京大学黄璞教授、何建华副教授等组成的联合……花心的基因会遗传给后代求爸爸不要再花心了,不然会祸及后代每一对父母都希望把自己好的基因遗传给孩子,例如那些长相好看、身体健康、身材高大的基因。但是根据遗传学研究显示,父母的所有基因都会遗传给孩子,不管是好的基因,还是坏的基因。……2022年全球动力电池企业新排名前十中国占6席,比亚迪超过松2022年8月,市场研究机构SNEResearch发布报告称,今年上半年全球电动汽车电池装机量同比大涨76。8至203。4GWh。中国动力电池厂商再次以绝对优势霸榜,前二十名中……再说一遍,我们没有造车计划!我们没有造车计划。8月28日举行的第四届世界新能源汽车大会上,在发布面向汽车和移动出行领域的整体解决方案时,微软中国副总裁、微软中国区企业商用事业部总经理袁以拓再次撇清了造车传……一两千元手机怎么选?目前这4部手机最值得买,开学季的最佳选择一两千元手机怎么选?目前这4部手机最值得买,开学季的最佳选择。第一部:realme真我GTNeo2综合配置很高的一部手机,而且定位也不低,这个手机就是realme真……
泪目!瓦妮莎带3个女儿参观科比旧宅,娜塔莉亚晒与爸爸珍贵合影正值父亲节,不少人发朋友圈来表达自己对父亲的感恩之情,明星也不例外,网友发现瓦妮莎的大女儿娜塔莉亚在INS上传了自己与父亲科比的旧照,照片里的娜娜十分年幼,身着连衣裙站在玩手机……肚子大?这6个原因你应该知道!该如何减肥,都给你列出来了嘿嘿嘿。。。家人们,我来了!我是瘦了20斤的旺仔美女作为一个合格的LSP,旺仔不能一个人吃独食,好身材就要大家一起欣赏。今天要说的泫雅南韩小野马,一直以性感美艳闻名……神奇的材料气凝胶丨科学史气凝胶是一种神奇的材料!它非常轻,即使把一块气凝胶放在花蕊上也不会将花蕊压弯。之所以如此轻是因为气凝胶的内部包含了许许多多细小的孔,这些孔的尺寸在纳米或微米尺度,所有孔的体积合……杨超越早期照片被爆,双马尾灵气十足,真是老天爷赏饭近日,有网友在社交平台曝光杨超越早期录制节目的照片。在照片中,杨超越身穿纯白色礼服,头扎双马尾,面相清秀可人,宛如洋娃娃一般,而且她的头身比例太完美了,脸部只有巴掌大小,……一年选中7位首轮秀!机遇天赋,火箭离开哈登依然能展翅翱翔在今年的选秀大会上,谁是最大的赢家,很明显火箭和雷霆绝对屈指一数,火箭队选中了3个首轮秀,而在2021年选秀大会上,火箭队选中4个首轮秀,短短一年时间,火箭就选中了7个首轮秀,……NBA市场上的四条大鱼,三状元一探花,他们都能改变联盟的格局虽然NBA总决赛还未结束,自由交易市场也没有开启,但是有几名合同到期的球员早就被各支球队关注,其中就包括三名状元秀和一名探花秀。他们在休赛期的去向牵动着很多球迷的心,作为联盟的……天热不想做饭,这3款速食面一定别错过,方便还省事,美味又饱腹天热不想做饭,这3款速食面一定别错过,方便还省事,美味又饱腹7月的天气是炎热的,面对居高不下的高温,很多人都不想做饭,尤其是下班后,本来工作一天就已经很疲惫了,在经历超长……好玩又有礼,张之洞体育公园一岁啦(文末独家福利)这个五一哪里耍原地出游成首选值此开园一周年之际超级网红热门打卡地,汉阳张之洞体育公园带着满满诚意邀您玩游戏做运动为假期健康生活,注入满……洋气精致的瑜伽裤穿搭十分衬气质,穿出时尚个性与风格,好看精致瑜伽裤的搭配有个万能公式,胖瘦型的都可以用这个公式,看看下面几组示范:稍胖一点的姑娘可以用小脚裤或短裤来搭配a字裙。上图中的丹宁风格的上衣就比较适合胖型妹子,可以盖过长裤的短和……文旅新体验,在家门口的好去处里驰骋绿茵场,就等你了之前,小编为大家整理了宝山区部分足球场地开放信息看了以后你心动了吗?是否也想驰骋绿茵场?今天,小编继续为大家双手奉上宝山这些家门口的好去处一……隐忍43年熬死花心丈夫,独揽70亿家产,何莉莉教科书式斗小3本宫不死,尔等终究是妃。本以为,这句话仅仅是电视剧中才会出现的大女主台词。直到了解了一位名叫何莉莉的美艳女星。她是邓丽君的闺蜜,是邵氏新十二钗中最被看好的艺人……热血传奇沉默版本测试期怎么玩1,选职业,必须道士呀。玩过沉默的都知道,游戏难度有三种:简单、难、地狱模式,对应的三个职业:道士、法师、战士。三个职业在沉默版本所扮演的角色也不尽相同,道士打BOSS利器,法……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网