写点什么

【Android 面试技巧】当面试官问你 glide 的时候,android 嵌入式开发实战 pdf

用户头像
Android架构
关注
发布于: 11 小时前

pendingRequestManagerFragments.put(fm, current);//保存到 map 集合 fm.beginTransaction().add(current, FRAGMENT_TAG).commitAllowingStateLoss();//添加到 Actvity 中 handler.obtainMessage(ID_REMOVE_FRAGMENT_MANAGER, fm).sendToTarget();}}return current;}


这部分代码涉及 FragmentManager 的使用,忘了怎么使用的朋友可以去复习一下。**代码不难理解,就是一个目的,得到 Fragment 并且返回这个 Fragment。**先通过 findFragmentByTag 获取,如果为 null,则会从 pendingRequestManagerFragments 这个 Map 集合去获取,如果还是为 null,则直接 new 一个 Fragment,并且保存到 pendingRequestManagerFragments 以及添加到 Activity 中。**这部分的代码就是 Fragment 和 Actvity 关联上了,这样就可以通过 Fragment 得知当前 Activty 的生命周期。**追踪 RequestManagerFragment,看看它的生命周期里面做了什么操作,源码如下:


private final ActivityFragmentLifecycle lifecycle;@Overridepublic void onStart() {super.onStart();lifecycle.onStart();}


@Overridepublic void onStop() {super.onStop();lifecycle.onStop();}


@Overridepublic void onDestroy() {super.onDestroy();lifecycle.onDestroy();unregisterFragmentWithRoot();}


Fragment 的的生命周期里(我们只关注贴出代码的三个生命周期),ActivityFragmentLifecycle 类都调用了相同名字的方法,接下来看看 ActivityFragmentLifecycle 的相应方法里面有什么操作。


private final Set<LifecycleListener> lifecycleListeners =Collections.newSetFromMap(new WeakHashMap<LifecycleListener, Boolean>());void onStart() {isStarted = true;for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {lifecycleListener.onStart();}}


void onStop() {isStarted = false;for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {lifecycleListener.onStop();}}


void onDestroy() {isDestroyed = true;for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {lifecycleListener.onDestroy();}}


相应的方法里都调用了 LifecycleListener 的相关方法,LifecycleListener 是一个接口,作用在源码里写得很清楚:An interface for listener to lifecycle events.,监听生命周期的接口。既然是个接口,就找出实现它的类,实现 LifecycleListener 的类是 RequestManager。RequestManager 类,它实现了 LifecycleListener 接口,三个方法里面的内容如下。


/**


  • Lifecycle callback that registers for connectivity events (if the

  • android.permission.ACCESS_NETWORK_STATE permission is present) and restarts failed or paused

  • requests.*/@Overridepublic synchronized void onStart() {resumeRequests();targetTracker.onStart();}


/**


  • Lifecycle callback that unregisters for connectivity events (if the

  • android.permission.ACCESS_NETWORK_STATE permission is present) and pauses in pr


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


ogress loads.*/@Overridepublic synchronized void onStop() {pauseRequests();targetTracker.onStop();}


/**


  • Lifecycle callback that cancels all in progress requests and clears and recycles resources for

  • all completed requests.*/@Overridepublic synchronized void onDestroy() {targetTracker.onDestroy();for (Target<?> target : targetTracker.getAll()) {clear(target);}targetTracker.clear();requestTracker.clearRequests();lifecycle.removeListener(this);lifecycle.removeListener(connectivityMonitor);mainHandler.removeCallbacks(addSelfToLifecycle);glide.unregisterRequestManager(this);}


requestTracker 是用来追踪取消和重新启动正在进行,已完成和失败的请求。看到这里我们可以猜想,RequestManagerFragment 生命周期变化的时候回调 RequestManager 的 onStart、onStop、onDestroy 方法,然后 Request 就做出相应的操作,Activity 的生命周期是和 Request 的生命周期绑定起来。要验证这个猜想,就要找到 RequestManager 是怎么样监听到 Fragment 的生命周期的。我们来看看 RequestManager 的创建


private RequestManager fragmentGet(@NonNull Context context,@NonNull android.app.FragmentManager fm,@Nullable android.app.Fragment parentHint,boolean isParentVisible) {RequestManagerFragment current = getRequestManagerFragment(fm, parentHint, isParentVisible);RequestManager requestManager = current.getRequestManager();if (requestManager == null) {// TODO(b/27524013): Factor out this Glide.get() call.Glide glide = Glide.get(context);requestManager =factory.build(glide, current.getGlideLifecycle(), current.getRequestManagerTreeNode(), context);current.setRequestManager(requestManager);//将 Fragment 的 lifecycle 交给 RequestManager 管理}return requestManager;}


以上代码说明,通过工厂模式创建 RequestManager,并且将 Fragment 的 lifecycle 交给 RequestManager 管理,代码current.getGlideLifecycle()就是获取到 lifecycle。再回头去看 ReqeustManager,找到了 lifecycle 操作 LifecycleListener 的代码,在构造器将 LifecycleListener 添加到 lifecycle,源码如下:


RequestManager(Glide glide,Lifecycle lifecycle,RequestManagerTreeNode treeNode,RequestTracker requestTracker,ConnectivityMonitorFactory factory,Context context) {this.glide = glide;this.lifecycle = lifecycle;this.treeNode = treeNode;this.requestTracker = requestTracker;this.context = context;


connectivityMonitor =factory.build(context.getApplicationContext(),new RequestManagerConnectivityListener(requestTracker));


//省略部分代码 if (Util.isOnBackgroundThread()) {mainHandler.post(addSelfToLifecycle);} else {lifecycle.addListener(this);}lifecycle.addListener(connectivityMonitor);


//省略部分代码}


Lifecycle 是用来添加和删除 LifecycleListener,而 ReqeustManager 的构造方法里,将 LifecycleListener 添加到 lifecycle 里面。


看到这里,也就验证了我们的猜想了。ReqeustManager 是来代理管理 Request 的生命周期方法,也就是请求的生命周期。glide 就是通过 ReqeustManager 监听到 Fragment 的生命周期,从而根据生命周期管理让 Request 做出相对应的请求。

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
【Android面试技巧】当面试官问你glide的时候,android嵌入式开发实战pdf