【Android 面试技巧】当面试官问你 glide 的时候,android 嵌入式开发实战 pdf
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
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 做出相对应的请求。
评论