专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

字节跳动一面之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的生命周期也会和整个应用程序一样。
  以上就是字节面试后总结的几个要点,还不会的同学赶紧学起来吧,感谢您的阅读,创造不易,如果您觉得本篇文章对您有帮助,请点击关注小编,您的支持就是小编创作的最大动力!

天价饭店600元一餐,国内又一景区被除名,游客请我也不去我国的乡村数量占据大多数,而农村如何脱贫致富又是一个十分让人头疼的问题,于是我国根据不同地区不同乡村形成的不同文化内涵和历史底蕴形成了自己独特的旅游产业。这其中最鲜明的代表就有以红出行来正安吉他文化产业园国家级4A景区,一起跟着音乐去旅行正安吉他文化产业园国家级4A景区吉他产业园乐器文化展厅魅力文化吉他由于其音色优雅,简单易学,有着极富个性的音色和表现手法,让多少人为之魂牵梦萦。既能表达委婉动人的喃喃细语,也能表达工信部赵策我国移动物联网连接数累计达17。5亿户C114讯11月15日消息(九九)在日前举行的首届移动物联网大会(2022)上,工业和信息化部信息通信发展司副司长赵策表示,移动物联网基于移动通信网络提供物联服务,推动人机物智能泛涉贷款三查不尽职等四项违规,重庆银行一支行被罚150万央广网北京11月16日消息银保监会网站近日披露的罚单显示,重庆银行股份有限公司龙头寺支行被罚款150万元。行政处罚公开信息表显示,重庆银行龙头寺支行主要存在的违法违规事实包括贷款三网友逛动物园被猩猩扔大便,哈哈哈哈哈哈迟早被评论经历笑死以前逛动物园看可爱动物带来快乐现在逛动物园为可爱动物带去快乐来看下网友们逛动物园怨种经历属于是苦了自己,逗乐了大伙感受下今日份的沙雕鉴赏往下翻阅收获快乐这猩猩和峨眉山猴子有得一拼潜玉隆拉措317国道上ampampquot最美的遇见ampampquot玉隆拉措,又名新路海,藏文的意思是一见倾心的圣湖。之所以有这样的名字,相传当年格萨尔王的爱妃珠穆被这座神湖的绝色佳境深深吸引,后人为了纪念这位英雄的爱妃而将此湖命名玉隆拉措。这里海自古以来,管人缚人的东西都不长久,育人化人的文化才能永恒法律制度是无情的,但法律制度是有漏洞的,而且执法的人也有私心,所以,钻法律制度空子的人大有人在,这种情况无可避免,古今皆然。历史上各朝代的法律制度多如牛毛,但最后都淹没于历史的尘埃刚交车就玩消失,恒驰汽车北京销售公司经营异常(文张家栋编辑周远方)11月15日,企查查信息显示,恒驰国瑞新能源汽车销售(北京)有限公司被列入经营异常,原因为通过登记的住所或经营场所无法联系。股权穿透图显示,该公司由恒驰新能源中国航天博物馆开馆可沉浸式体验火箭发射现场实物展出我国第一颗人造地球卫星东方红一号的备份星神舟四号飞船返回舱和降落主伞嫦娥五号月球样品全新打造长征五号运载火箭转运发射模拟平台中国空间站VR漫游系统11月16日,中国航天博物一直觉得跟孩子谈性还太早,直到孩子说被同学要求脱裤子孩子们才5岁多3岁多,之前很少去跟他们谈性教育的知识,总觉得周围接触的人都比较熟悉。而且孩子幼儿园的同学们都是邻居,经常在一起玩,也没太在意,只是告诉他们男孩与女孩的区别,然后上厕想让孩子爱上学习,家长应该做什么呢?(一)想让孩子爱上学习,家长应该怎么做呢?第一点就是我们在陪学的时候,要给孩子营造一个好的学习氛围。有的家长在陪伴孩子的时候,坐在孩子的旁边刷手机,偶尔抬头看到孩子走神就批评,这是无效的
北辰科技挂牌新三板2021年实现净利润3117万元符合北交所上市第一套财务标准挖贝网9月20日消息,包头北辰饲料科技股份有限公司(证券简称北辰科技,证券代码873875)近日成功挂牌新三板,该公司是一家饲料生产商,去年归母净利润3117。3万元,业绩符合北交教育部保障港澳台同胞子女平等享受当地随迁子女入学相关政策港澳台同胞子女在内地(大陆)就读中小学有何政策?9月20日,在教育部召开的教育这十年11系列第十四场新闻发布会上,教育部港澳台办常务副主任闫炳辰对这一问题进行了回答。闫炳辰表示,近成年人才能看懂的10幅人性漫画有人说,听过许多道理却依然过不好这一生听过之后,是否真的懂了?看完这组图片,或许你就懂一个成功的男人的背后一定有一个温柔的女人同样一个光鲜亮丽的女人背后也一定有宠她入骨的男人我们一中国足协对马宁侮辱性条幅事件仅仅谴责批评,就是新的馁靖政策8月31日,中超官方发布公告,针对马宁的侮辱性条幅事件,对个别球迷的这种侮辱性行为进行强烈谴责,对河南赛区进行严肃批评。公告如下2022年8月5日,中超联赛时隔978天终于重新回归腾讯科学小会上,高分总师赵坚解密羲和五个国际首次羲和是我国上古神话中的太阳之母,她有十个太阳儿子,每日只带一个出来工作羲和驭着龙车,从汤谷出发,途径16个站,到达蒙谷,日复一日,形成了大地的早晚晦明,年复一年,人间从此有了温暖。2022年中国生活服务业数字化报告(实践案例四大趋势政策梳理)来源阿里巴巴报告看点1生活服务业数字化发展现状分析2重点业态数字化发展现状及实践案例3数字化发展趋势及挑战。4生活服务业政策梳理需要获取完整PDF电子版参考学习的同时也需要获取更多江山美人我全都要!九阴江湖满足你所有需求大部分玩武侠游戏的玩家其实都是抱着目的前来的,有的是为了满足小时候的梦想,有的是为了谈一场穿越时空的恋爱,有的则是感受冷兵器时代的战斗激情,但现在有这么一款武侠游戏能一下子满足你的发改委正加快研究推动出台政策举措,促消费加快复苏!未来几个月仍继续防范猪价过快上涨点蓝字关注,不迷路9月19日,国家发改委召开9月新闻发布会,对当前热点关注的国常会部署19项接续政策落实措施推动重大项目开工建设防范猪肉价格上涨过快推动新能源汽车产业高质量发展等问加速缩表美房地产提前入冬记者樊融杰9月以来,美联储加速缩减资产负债表(以下简称缩表),从此前的每月上限475亿美元的缩表步伐快速攀升至每月上限950亿美元。多位专家表示,美联储加速缩表将推升美国债券的长端新款iPadPro1112。9信息提前曝光,预计10月发布在本月举行的苹果秋季新品发布会上,苹果发布了包括iPhone14系列手机在内的多款重磅新品。不过iPadMac产品线却并未迎来产品更新。而按照近年来苹果新品发布的习惯,预计新款的i三年收入破10亿美元,项目组详细复盘出海要注意这三点使命召唤手游(以下简称CoDM)上市近三年来取得了太多的好成绩。2019年海外在线第一周,游戏登上了13个国家的畅销书139个国家的免费排行榜,之后在各种统计排行榜上,大家都是排行
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网