1、前语

  • 从使用上来讲,Glide的确十分简略。
  • Glide.with(this).load("").into(imageView);
  • 要拆解它一般分为3段,今天我们来讲榜首段with。
  • 这个中心在于生命周期的绑定,有很多优异结构学习了这一思想,比如liveData
  • 为什么要有生命周期管理呢?主要是为了避免内存泄漏和节省资源,比如我在加载中,然后activity被关闭了,这时候我们glide感知到了这一行为,就可以不把获得的bitmap资源设置到一个不存在的view上。
  • 这儿我要点评一下百度地图,居然要在activity的各个生命周期函数中都要调用api,这很容易形成失误。

2、Glide是如何绑定宿主的生命周期的?

  • Glide.with()绑定的生命周期有2种
    • Application
      • 传入applicationContext或许在子线程中调用Glide.with
      • 这个压根不用管,随意建一个,横竖是随App消亡而消亡的
    • 非Application
      • 宿主是Activity、fragment
      • 树立一个空白fragment,和Activit有、fragment绑定。然后通过空fragment和RequestManager绑定,requestManager中的生命周期去驱动glide。这样glide只要写一句就能跟着宿主的生命周期改动而改动了。
      • 空的fragment和RequestManager绑定的方法
        • 将requestManager加入到fragment的Set < LifecycleListener>,然后宿主生命周期改动,则fragment生命周期改动,然后fragment在对应生命周期遍历加入的LifecycleListener,然后调用对应的函数,
        • 宿主fragment或许acitivity等宿主调用onStart()则->空白fragment().onStart->遍历空白fragment中ActivityFragmentLifecycle.onStart()->遍历Set< LifecycleListener>中的子元素然后调用onStart()->RequestManager.onStart()
          `

3、仿照代码

3.1、希望到达作用

在activity中调用Glide.with(this); 然后再RequestManager中的生命周期跟着acitivty改动而改动。

3.2 中心代码

3.2.1 Glide.class
  • with->RequestManagerRetriever->RequestManager
Glide.class
//1、with->RequestManagerRetriever->RequestManager
@NonNull
public static RequestManager with(@NonNull Activity activity) {
    return getRetriever(activity).get(activity);
}
//
@NonNull
private static RequestManagerRetriever getRetriever(@Nullable Context context) {
    return Glide.get(context).getRequestManagerRetriever();
}
//单例 保证仅有
@NonNull
public static Glide get(@NonNull Context context) {
    if (glide == null) {
        synchronized (Glide.class) {
            if (glide == null) {
                glide = new Glide(context);
            }
        }
    }
    return glide;
}
private final RequestManagerRetriever requestManagerRetriever;
public Glide(Context context) {
    this.requestManagerRetriever = new RequestManagerRetriever();
}
3.2.2 RequestManagerRetriever.class
  • 获得RequestManager,将宿主和空白fragment绑定,空白fragment和requetsManager绑定
RequestManagerRetriever.class
//如果是子线程就去树立全局的requestManager,我们主线流程是看绑定acitvity的requetsmanager,
public  RequestManager get(Activity activity) {
    if(Util.isOnBackgroundThread()){
        return getApplicationManager(activity.getApplicationContext());
    }else{
        Util.assertNotDestroyed(activity);
        android.app.FragmentManager fragmentManager = activity.getFragmentManager();
        return RequestManagerGet(activity,fragmentManager);
    }
}
private RequestManager RequestManagerGet(Context context,
                                   @NonNull android.app.FragmentManager fragmentManager) {
    //1、 fragmentmanager中获取requestManagerFragment
    //!!!![在这儿将生命周期与空白fragment与activity绑定]!!!!!
    RequestManagerFragment requestManagerFragment = getRequestManagerFragment(fragmentManager);
    //2、从该Framgnet中获取RequestManager
    RequestManager requestManager = requestManagerFragment.getRequestManager();
    //3、初次获取,则实例化RequestManager
    if(requestManager == null){//这样做的意图是为了  一个Activity或Fragment 只能有一个 RequestManager】
        //3.1 实例化
        Glide glide = Glide.get(context);
        //!!!![在这儿将RequestManager的中的生命周期与空白fragment绑定]!!!!!
        requestManager = new RequestManager(glide,requestManagerFragment.getGlideLifecycle(),context);
        //3.2 设置fragment对应的RequestManager
        requestManagerFragment.setRequestManager(requestManager);
    }
    return  requestManager;
}
private RequestManagerFragment getRequestManagerFragment(
        @NonNull final android.app.FragmentManager fragmentManager) {
    //1.1 通过fragment_tag获取fragment
    RequestManagerFragment fragmentByTag = (RequestManagerFragment) fragmentManager.findFragmentByTag(FRAGMENT_TAG);
    if(fragmentByTag == null){
        //1.2 尝试从 【记载保存】 中获取fragment
        fragmentByTag = pendingRequestManagerFragments.get(fragmentManager);
       //1.3 实例化  Fragment
        if(fragmentByTag == null){
            //1.3。1 新建空白的fragment
            fragmentByTag = new RequestManagerFragment();
            //1.3.2 记载保存 到映射中
            pendingRequestManagerFragments.put(fragmentManager,fragmentByTag);
            //1.3.3 提交Fragment 事务
            fragmentManager.beginTransaction().add(fragmentByTag,FRAGMENT_TAG).commitAllowingStateLoss();
            //1.3.4 post 个消息 保证立即实行
            handler.obtainMessage(ID_REMOVE_FRAGMENT_MANAGER).sendToTarget();
        }
    }
    return fragmentByTag;
}
@Override
public boolean handleMessage(@NonNull Message msg) {
    switch (msg.what){
        case ID_REMOVE_FRAGMENT_MANAGER:  // 移除 【记载保存】  1.3.5 post 一个消息
            FragmentManager fm = (FragmentManager) msg.obj;
            pendingRequestManagerFragments.remove(fm);// 1.3.6 移除暂时记载中的映射关系
            break;
        default:
            break;
    }
    return false;
}
3.2.3 RequestManagerFragment.class
  • 创建一个ActivityFragmentLifecycle,用于将RequestMangaer的生命中期加入到创建一个ActivityFragmentLifecycle中,便利RequestManagerFragment操控。
RequestManagerFragment.class
public class RequestManagerFragment extends Fragment {
    private RequestManager requestManager;
    private ActivityFragmentLifecycle lifecycle;
    public RequestManagerFragment() {
        this(new ActivityFragmentLifecycle());
    }
    @SuppressLint("ValidFragment")
    public RequestManagerFragment(@NonNull ActivityFragmentLifecycle lifecycle) {
        this.lifecycle = lifecycle;
    }
    @Override
    public void onStart() {
        super.onStart();
        lifecycle.onStart();
    }
    @Override
    public void onStop() {
        super.onStop();
        lifecycle.onStop();
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        lifecycle.onDestroy();
    }
    public RequestManager getRequestManager() {
        return requestManager;
    }
    public IKLifecycle getGlideLifecycle() {
        return lifecycle;
    }
    public void setRequestManager(RequestManager requestManager) {
        this.requestManager = requestManager;
    }
}
3.2.4 ActivityFragmentLifecycle.class
  • 中包括Set< IKLifecycleListener> 把RequestManager加入到集结傍边,便利RequestManagerFragment 调用生命周期时,操作ActivityFragmentLifecycle,以操作RequestManager。宿主fragment或许acitivity等宿主调用onStart()则->空白fragment().onStart->遍历空白fragment中ActivityFragmentLifecycle.onStart()->遍历Set< LifecycleListener>中的子元素然后调用onStart()->RequestManager.onStart()
public class ActivityFragmentLifecycle implements IKLifecycle {
    private final Set<IKLifecycleListener> lifecycleListeners =
            Collections.newSetFromMap(new WeakHashMap<IKLifecycleListener,Boolean>());
    private boolean isStarted;
    private boolean isDestroyed;
    @Override
    public void addListener(@NonNull IKLifecycleListener lifecycleListener) {
        lifecycleListeners.add(lifecycleListener);
        if(isDestroyed){
            lifecycleListener.onDestroy();
        }else if(isStarted){
            lifecycleListener.onStart();
        }else{
            lifecycleListener.onStop(); // 初次启动:会默许 onStop 先停止   然后再onStart 为什么?
        }
    }
    @Override
    public void removeListener(@NonNull IKLifecycleListener lifecycleListener) {
            lifecycleListeners.remove(lifecycleListener);
    }
    void onStart() {
        isStarted = true;
        for (IKLifecycleListener lifecycleListener : lifecycleListeners) {
            lifecycleListener.onStart();
        }
    }
    void onStop() {
        isStarted = false;
        for (IKLifecycleListener lifecycleListener : lifecycleListeners) {
            lifecycleListener.onStop();
        }
    }
    void onDestroy() {
        isDestroyed = true;
        for (IKLifecycleListener lifecycleListener : lifecycleListeners) {
            lifecycleListener.onDestroy();
        }
    }
}
3.2.4 其它接口
public interface IKLifecycle {
    void addListener (@NonNull IKLifecycleListener lifecycleListener);
    void removeListener(@NonNull IKLifecycleListener lifecycleListener);
}

public interface IKLifecycleListener {
    void onStart();
    void onStop();
    void onDestroy();
}

4、总结

  • Glide.with的中心就在于生命周期绑定
  • Glide.with传入applicationContext或许在子线程中就创建一个ApplicationRequestManager,也不用管生命周期,创建时onstart,销毁就不用管了,横竖app都销毁了。
  • Glide.with传入fragment或许acitivty。会创建一个RequestManager.
    • acitivty 通过getFragmentManager,fragment通过getChildFragmentManager。当然有对androidx或许android包不用的支撑,都是一个原理。
    • 获得与宿主绑定的仅有空白fragment然后让仅有空白fragment与仅有新建的requestmanager绑定,这儿的新建是指没有就新建,有就从缓存中拿。
    • 那么宿主fragment或许acitivity等宿主调用onStart()则->空白fragment().onStart->遍历空白fragment中ActivityFragmentLifecycle.onStart()->遍历Set< LifecycleListener>中的子元素然后调用onStart()->RequestManager.onStart()
    • 其它生命周期同理