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

Glide生命周期管理原理 学习与总结

Glide: Glide 是一个强大的 Android 图片加载库,它能够自动管理图片加载请求与 Android 组件的生命周期绑定,防止内存泄漏和无效加载。

Glide 初始化绑定

​​​​​​​// 支持的上下文类型
Glide.with(Activity)
Glide.with(Fragment)
Glide.with(FragmentActivity)
Glide.with(Context)
Glide.with(View)

Glide生命周期绑定流程

Glide.with(this): 下面都是它的重载方法,Context,Activity,FragmentActivity, Fragment, android.app.Fragment fragment,View都可以作为他的参数(如上图代码块),内容大同小异,都是先getRetriever,然后再get(Context)

@NonNull
public static RequestManager with(@NonNull Context context) {
    return getRetriever(context).get(context);
}

@NonNull
public static RequestManager with(@NonNull Activity activity) {
    return getRetriever(activity).get(activity);
}

@NonNull
public static RequestManager with(@NonNull FragmentActivity activity) {
    return getRetriever(activity).get(activity);
}

@NonNull
public static RequestManager with(@NonNull Fragment fragment) {
    return getRetriever(fragment.getContext()).get(fragment);
}

@NonNull
public static RequestManager with(@NonNull View view) {
    return getRetriever(view.getContext()).get(view);
}
获取生命周期所有者:
  • Glide 使用 RequestManagerRetriever 获取或创建对应的 RequestManager

  • 对于 Activity/Fragment的Context,Glide 会添加一个空白/隐藏的 SupportRequestManagerFragment 用来监听生命周期

@NonNull
public RequestManager get(@NonNull FragmentActivity activity) {
    if (Util.isOnBackgroundThread()) {
      return get(activity.getApplicationContext());
    } else {
      assertNotDestroyed(activity);
      FragmentManager fm = activity.getSupportFragmentManager();
      return supportFragmentGet(activity, fm, /*parentHint=*/ null, isActivityVisible(activity));
    }
}

@NonNull
private RequestManager supportFragmentGet(
      @NonNull Context context,
      @NonNull FragmentManager fm,
      @Nullable Fragment parentHint,
      boolean isParentVisible) {
    SupportRequestManagerFragment current =
        getSupportRequestManagerFragment(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);
    }
    return requestManager;
}

@NonNull
private SupportRequestManagerFragment getSupportRequestManagerFragment(
      @NonNull final FragmentManager fm, @Nullable Fragment parentHint, boolean isParentVisible) {
    SupportRequestManagerFragment current =
        (SupportRequestManagerFragment) fm.findFragmentByTag(FRAGMENT_TAG);
    if (current == null) {
      current = pendingSupportRequestManagerFragments.get(fm);
      if (current == null) {
        current = new SupportRequestManagerFragment();
        current.setParentFragmentHint(parentHint);
        if (isParentVisible) {
          current.getGlideLifecycle().onStart();
        }
        pendingSupportRequestManagerFragments.put(fm, current);
        fm.beginTransaction().add(current, FRAGMENT_TAG).commitAllowingStateLoss();
        handler.obtainMessage(ID_REMOVE_SUPPORT_FRAGMENT_MANAGER, fm).sendToTarget();
      }
    }
    return current;
}

创建生命周期监听器

  • Glide 创建一个 ActivityFragmentLifecycle 实例

  • 这个监听器会跟踪 Activity/Fragment 的生命周期状态

SupportRequestManagerFragment.java

public SupportRequestManagerFragment() {
    this(new ActivityFragmentLifecycle());
}

@VisibleForTesting
@SuppressLint("ValidFragment")
public SupportRequestManagerFragment(@NonNull ActivityFragmentLifecycle lifecycle) {
    this.lifecycle = lifecycle;
}

绑定生命周期事件

  • 当宿主 (Activity/Fragment) 的生命周期发生变化时,会回调到 LifecycleListener

  • Glide 的 RequestManager 实现了 LifecycleListener 接口


  @Override
  public void onDetach() {
    super.onDetach();
    parentFragmentHint = null;
    unregisterFragmentWithRoot();
  }

  @Override
  public void onStart() {
    super.onStart();
    lifecycle.onStart();
  }

  @Override
  public void onStop() {
    super.onStop();
    lifecycle.onStop();
  }

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

相关文章:

  • 嵌入式单片机ADC数模转换的基本方法
  • 云手机如何防止设备指纹被篡改
  • 速查Linux常用指令
  • Python基于Django的电影个性化推荐系统【附源码、参考文档】
  • git和VScode
  • RAG从入门到放弃
  • PyCharm使用说明
  • JS中模块化导入导出的方法有几种,这几种之间有什么区别?
  • 手机为电脑提供移动互联网络的3种方式
  • 六十天Linux从0到项目搭建(第二十五天)(互斥、信号量、IPC、信号的产生、处理、Alarm)
  • Linux 添加定时任务
  • 人工智能之数学基础:基于初等反射矩阵完成矩阵的QR分解
  • 【自学笔记】Spring Cloud语言基础知识点总览-持续更新
  • LocalDateTime类
  • 光压发电机的设计(转子部分)
  • 《网络管理》实践环节03:snmp服务器上对网络设备和服务器进行初步监控
  • Java项目之基于ssm的课程在线教学平台(源码+文档)
  • Retinex 算法 + MATLAB 软件,高效率完成图像去雾处理
  • 2021年ASOC SCI1区:自适应差分进化算EaDE,深度解析+性能实测
  • 【免费革命】GPT-4o图像生成全开放!OpenAI颠覆创作门槛,设计师惊呼“饭碗被抢”​
  • 网站建设找哪家好/怎么快速优化网站
  • 深圳网站建设制作设计/google play服务
  • 长白山网站学做管理平台/谷歌seo技巧
  • 重庆网站建设公司费用/百度怎么推广自己的信息
  • wordpress中文标签云插件/淄博seo网站推广
  • 做宠物网站心得/国际国内新闻最新消息今天