当前位置: 首页 > news >正文

新版Glide检测生命周期原理

本文章使用的是glide 4.15.1

public class RequestManagerRetriever implements Handler.Callback {rivate final LifecycleRequestManagerRetriever lifecycleRequestManagerRetriever;public RequestManagerRetriever(@Nullable RequestManagerFactory factory, GlideExperiments experiments) {//构造函数this.factory = factory != null ? factory : DEFAULT_FACTORY;lifecycleRequestManagerRetriever = new LifecycleRequestManagerRetriever(this.factory);
}@NonNull
public RequestManager get(@NonNull FragmentActivity activity) {if (Util.isOnBackgroundThread()) {return get(activity.getApplicationContext());}assertNotDestroyed(activity);frameWaiter.registerSelf(activity);boolean isActivityVisible = isActivityVisible(activity);Glide glide = Glide.get(activity.getApplicationContext());return lifecycleRequestManagerRetriever.getOrCreate(activity,glide,activity.getLifecycle(),//关键代码activity.getSupportFragmentManager(),isActivityVisible);
}
}final class LifecycleRequestManagerRetriever {@Synthetic final Map<Lifecycle, RequestManager> lifecycleToRequestManager = new HashMap<>();@NonNull private final RequestManagerFactory factory;LifecycleRequestManagerRetriever(@NonNull RequestManagerFactory factory) {this.factory = factory;}RequestManager getOrCreate(Context context,Glide glide,final Lifecycle lifecycle,//关键代码,这个是上面的activity.getLifecycle()FragmentManager childFragmentManager,boolean isParentVisible) {Util.assertMainThread();RequestManager result = getOnly(lifecycle);if (result == null) {LifecycleLifecycle glideLifecycle = new LifecycleLifecycle(lifecycle);//关键代码result =factory.build(glide,glideLifecycle,//在这里面会创建RequestManager并把它加入glideLifecycle里面new SupportRequestManagerTreeNode(childFragmentManager),context);lifecycleToRequestManager.put(lifecycle, result);glideLifecycle.addListener(new LifecycleListener() {@Overridepublic void onStart() {}@Overridepublic void onStop() {}@Overridepublic void onDestroy() {lifecycleToRequestManager.remove(lifecycle);}});// This is a bit of hack, we're going to start the RequestManager, but not the// corresponding Lifecycle. It's safe to start the RequestManager, but starting the// Lifecycle might trigger memory leaks. See b/154405040if (isParentVisible) {result.onStart();}}return result;
}
}//LifecycleLifecycle.java
final class LifecycleLifecycle implements Lifecycle, LifecycleObserver {@NonNullprivate final Set<LifecycleListener> lifecycleListeners = new HashSet<LifecycleListener>();@NonNull private final androidx.lifecycle.Lifecycle lifecycle;LifecycleLifecycle(androidx.lifecycle.Lifecycle lifecycle) {this.lifecycle = lifecycle;lifecycle.addObserver(this);//关键代码,把自己嵌入到了activity.getLifecycle(),当生命周期函数有变化时就会通过它的onStart(),onStop(),onDestroy()}@OnLifecycleEvent(Event.ON_START)public void onStart(@NonNull LifecycleOwner owner) {for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {lifecycleListener.onStart();}}@OnLifecycleEvent(Event.ON_STOP)public void onStop(@NonNull LifecycleOwner owner) {for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {lifecycleListener.onStop();}}@OnLifecycleEvent(Event.ON_DESTROY)public void onDestroy(@NonNull LifecycleOwner owner) {for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {lifecycleListener.onDestroy();}owner.getLifecycle().removeObserver(this);}@Overridepublic void addListener(@NonNull LifecycleListener listener) {lifecycleListeners.add(listener);if (lifecycle.getCurrentState() == State.DESTROYED) {listener.onDestroy();} else if (lifecycle.getCurrentState().isAtLeast(State.STARTED)) {listener.onStart();} else {listener.onStop();}}@Overridepublic void removeListener(@NonNull LifecycleListener listener) {lifecycleListeners.remove(listener);}
}LifecycleLifecycle把会把RequestManager加入它的列表中,以便有生命周期函数变化时就通过它
LifecycleRequestManagerRetriever.java中LifecycleLifecycle glideLifecycle = new LifecycleLifecycle(lifecycle);//关键代码result =factory.build(glide,glideLifecycle,//在这里面会创建RequestManager并把它加入glideLifecycle里面new SupportRequestManagerTreeNode(childFragmentManager),context);
//RequestManagerRetriever.java中的RequestManager工厂类
private static final RequestManagerFactory DEFAULT_FACTORY =new RequestManagerFactory() {@NonNull@Overridepublic RequestManager build(@NonNull Glide glide,@NonNull Lifecycle lifecycle,//关键代码@NonNull RequestManagerTreeNode requestManagerTreeNode,@NonNull Context context) {return new RequestManager(glide, lifecycle, requestManagerTreeNode, context);//关键代码}};public class RequestManagerimplements ComponentCallbacks2, LifecycleListener, ModelTypes<RequestBuilder<Drawable>> {public RequestManager(@NonNull Glide glide,@NonNull Lifecycle lifecycle,@NonNull RequestManagerTreeNode treeNode,@NonNull Context context) {this(glide,lifecycle,//关键代码treeNode,new RequestTracker(),glide.getConnectivityMonitorFactory(),context);
}// Our usage is safe here.
@SuppressWarnings("PMD.ConstructorCallsOverridableMethod")
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));glide.registerRequestManager(this);if (Util.isOnBackgroundThread()) {Util.postOnUiThread(addSelfToLifecycle);} else {lifecycle.addListener(this);//关键代码}lifecycle.addListener(connectivityMonitor);defaultRequestListeners =new CopyOnWriteArrayList<>(glide.getGlideContext().getDefaultRequestListeners());setRequestOptions(glide.getGlideContext().getDefaultRequestOptions());
}}

然后再由RequestManager的onStart(),onStop(),onDestroy()去通过相应的RequestTracker requestTracker和TargetTracker targetTracker做对应的处理

public class RequestManagerimplements ComponentCallbacks2, LifecycleListener, ModelTypes<RequestBuilder<Drawable>> {@SuppressWarnings("WeakerAccess")@Syntheticfinal Lifecycle lifecycle;@GuardedBy("this")private final RequestTracker requestTracker;@GuardedBy("this")private final TargetTracker targetTracker = new TargetTracker();
@Override
public synchronized void onStart() {resumeRequests();//关键代码targetTracker.onStart();//关键代码
}@Override
public synchronized void onStop() {pauseRequests();//关键代码targetTracker.onStop();//关键代码
}@Override
public synchronized void onDestroy() {targetTracker.onDestroy();//关键代码for (Target<?> target : targetTracker.getAll()) {clear(target);}targetTracker.clear();//关键代码requestTracker.clearRequests();//关键代码lifecycle.removeListener(this);//关键代码lifecycle.removeListener(connectivityMonitor);//关键代码Util.removeCallbacksOnUiThread(addSelfToLifecycle);glide.unregisterRequestManager(this);
}
}


总结:

总流程:Activity.getLifecycle()在LifecycleLifecycle构造函数里把LifecycleLifecycle this对象加入了Activity.getLifecycle(),LifecycleLifecycle对象传入RequestManager构造函数时,把RequestManager对象加入到了LifecycleLifecycle对象的监听列表里面,RequestManager对象又有RequestTracker和TargetTracker对象,有点饶,我写个抽象类(只为了看)

public class ComponentActivity{private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);public Lifecycle getLifecycle() {return mLifecycleRegistry;}//如上会通过Activity.getLifecycle().addObserver()方法加入到LifecycleLifecycle.this
}public cliass LifecycleLifecycle{@NonNullprivate final Set<LifecycleListener> lifecycleListeners = new HashSet<LifecycleListener>();@Overridepublic void addListener(@NonNull LifecycleListener listener) {lifecycleListeners.add(listener);}//LifecycleLifecycle会通过addListener()方法把RequestManager.this加入到lifecycleListeners@OnLifecycleEvent(Event.ON_START)public void onStart(@NonNull LifecycleOwner owner) {for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {lifecycleListener.onStart();//RequestManager.this在里面,会被通知到}}@OnLifecycleEvent(Event.ON_STOP)public void onStop(@NonNull LifecycleOwner owner) {for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {lifecycleListener.onStop();//RequestManager.this在里面,会被通知到}}@OnLifecycleEvent(Event.ON_DESTROY)public void onDestroy(@NonNull LifecycleOwner owner) {for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {lifecycleListener.onDestroy();//RequestManager.this在里面,会被通知到}owner.getLifecycle().removeObserver(this);}
}public class RequestManager implements LifecycleListener {private final RequestTracker requestTracker;private final TargetTracker targetTracker = new TargetTracker();@Overridepublic synchronized void onStart() {resumeRequests();targetTracker.onStart();}@Overridepublic synchronized void onStop() {pauseRequests();targetTracker.onStop();}@Overridepublic synchronized void onDestroy() {targetTracker.onDestroy();targetTracker.clear();requestTracker.clearRequests();}
}

http://www.lryc.cn/news/406283.html

相关文章:

  • Ansible的脚本-----playbook剧本【上】
  • sql注入学习与防护
  • 饥荒dst联机服务器搭建基于Ubuntu
  • AtCoder Beginner Contest 363
  • Protel DXP 面试题详解及参考答案(4万字长文)
  • 雪花算法 集群uid重复问题 uid-generator-spring-boot-starter
  • 【AutoDL】AutoDL+Xftp+Xshell+VSCode配合使用教程
  • 使用minio cllient(mc)完成不同服务器的minio的数据迁移和mc基本操作
  • Vue3分段控制器(Segmented)
  • SpringSecurity如何正确的设置白名单
  • 【Langchain大语言模型开发教程】评估
  • Python爬虫小项目实战
  • PHP Filesystem 简介
  • 源代码加密软件哪家好?五款企业级加密软件推荐
  • Redis常见的数据类型及操作方式
  • 谷粒商城实战笔记-55-商品服务-API-三级分类-修改-拖拽数据收集
  • AI绘画入门实践|Midjourney:使用 --seed 制作情侣头像与漫画
  • 笔记:Enum中FlagsAttribute特性的用法
  • QWidget如何切换ui
  • web网站组成
  • 带您详细了解安全漏洞的产生和防护
  • 【接口测试】params传参与body传参区别
  • 【docker】部署证书过期监控系统mouday/domain-admin
  • 高级java每日一道面试题-2024年7月17日
  • css中如何清除浮动
  • 【网络】tcp_socket
  • Live555源码阅读笔记:哈希表的实现
  • vue3创建vite项目
  • Maven概述
  • Easyu中datagrid点击时获取所在行的数据