Glide框架解析---生命周期的介绍(四)

上一篇博客中我们主要介绍了Glide调用的流程,涉及的类还有方法我在交互图中做了详细的介绍,这篇呢我们来介绍一下Glide的生命周期。本来我打算在博客中详细的写出每个类和每个过程,但是涉及的篇幅实在的太多了,所以之后的博客还是以思想为主,具体的源代码我会直接提供出来,当然有不懂的地方可以随时留言提问。

1.生命周期的监控

Glide是如何实现载体生命周期的监控的呢?其实思想和简单,就是在载体(Activity或Fragment)中插入一个新的FragmentFragment本身就是带有生命周期的,把这个新的Fragment和载体进行绑定,实现一个联动的效果,这样就能清楚的知道载体的生命周期,从而进行资源的加载和释放。

插入的新Fragment在Glide中是SupportRequestManagerFragment,这个类继承了Fragment;而SupportRequestManagerFragment这个类的创建实在RequestManagerRetriever这个类中,代码如下(下面是阉割版Glide中的源码):


  private Map<FragmentManager, SupportRequestManagerFragment> supports = new HashMap<>();    
/**
     * 获得Fragment
     * @param fm
     * @return
     */
    private SupportRequestManagerFragment getSupportRequestManagerFragment(FragmentManager fm) {
        SupportRequestManagerFragment fragment = (SupportRequestManagerFragment) fm.findFragmentByTag(FRAG_TAG);
        if (null == fragment) {
            fragment = supports.get(fm);
            if (null == fragment) {
                fragment = new SupportRequestManagerFragment();
                //先加入集合
                supports.put(fm, fragment);
                fm.beginTransaction().add(fragment, FRAG_TAG).commitAllowingStateLoss();
                handler.obtainMessage(REMOVE_SUPPORT_FRAGMENT, fm).sendToTarget();
            }
        }
        return fragment;
    }

    @Override
    public boolean handleMessage(Message msg) {
        switch (msg.what) {
            case REMOVE_SUPPORT_FRAGMENT:
                FragmentManager fm = (FragmentManager) msg.obj;
                supports.remove(fm);
                break;
        }
        return false;
    }

我们稍后来看这个方法是在哪里调用的,其他的我们先不管,主要来看一下Glide是如何处理这个Fragment的。

方法传入的参数FragmentManager是在载体中拿到的,首先从fm中通过tag来获取SupportRequestManagerFragment,因为第一次获取,所以fragment肯定是null。supports是一个集合,keyFragmentManager,其实就是载体;value是创建的SupportRequestManagerFragment。作用显而易见,就是判断是否创建了SupportRequestManagerFragment。所以呢上述的代码中,从第一次懂supports中获取的SupportRequestManagerFragment依然是null。之后会创建一个新的SupportRequestManagerFragment,然后放入到supports这个集合中。通过addcommit方法和载体进行绑定。最让人迷惑的是if中最后一句代码:通过handler,又把supports中刚刚加入的SupportRequestManagerFragment给移除了?这是为什么呢?

首先,我们要知道supports这个集合的作用是什么,supports的作用就是防止SupportRequestManagerFragment重复创建。那SupportRequestManagerFragment什么时候会重复创建呢?当Glide在Activity的onCreate方法中使用两次的时候,如果没有这个supports会导致SupportRequestManagerFragment创建两次。原因如下:

第一步:Activity执行onCreate的时候,主线程的Handler会发送一个Message,加入到消息队列中,等待被执行,我们命名为m1

第二步:Glide第一次在onCreate中进行图片的加载,载体和SupportRequestManagerFragment之间进行绑定的时候(执行commit或者commitAllowingStateLoss),主线程的Handler也会发送一个Message到消息队列中,等待被执行,我们命名为m2。此时m1正在被执行,还没有执行完,所以载体和SupportRequestManagerFragment之间并没有绑定成功

第三步:Glide第二次在onCreate中进行图片的加载,通过fm.findFragmentByTag进行查找,此时m2没有执行,所以载体和SupportRequestManagerFragment之间没有绑定成功,获得的SupportRequestManagerFragment依然是null,如果此时没有supports的话,会重新创建一个新的SupportRequestManagerFragment,导致重复创建

2.RequestMananger

上面说了很多,那getSupportRequestManagerFragment这个方法到底是在哪里调用的呢?我们看源码:

    private RequestManager supportFragmentGet(FragmentManager fm) {
        //从frgamentmanager中查找RequestManagerFragment
        SupportRequestManagerFragment fragment = getSupportRequestManagerFragment(fm);
        // 将RequestManager交给 Frgament 来保存
        RequestManager requestManager = fragment.getRequestManager();
        if (null == requestManager) {
            requestManager = new RequestManager(fragment.getGlideLifecycle());
            fragment.setRequestManager(requestManager);
        }
        return requestManager;
    }

在RequestManagerRetriever调用了很多的方法,从这个方法中我们可以看出来,最终的目的其实就是获取这个RequestManager。上面说道,我们通过创建一个新的Fragment和载体绑定,从而使Glide具有了生命周期,而这个RequestManager呢就是对生命周期的监听。RequestManager实现了LifecycleListener接口,LifecycleListener这个接口如下:

public interface LifecycleListener {

    void onStart();

    void onStop();

    void onDestroy();
}

每个RequestManager都和SupportRequestManagerFragment进行绑定,从而监听Fragment的生命周期。还有一个接口Lifecycle和实现类ActivityFragmentLifecycle,他们主要负责RequestManager的管理。代码如下:

public interface Lifecycle {

    void addListener(LifecycleListener listener);

    void removeListener(LifecycleListener listener);
}
/**
 * 生命周期监听管理器
 */
class ActivityFragmentLifecycle implements Lifecycle {

    //
    private final Set<LifecycleListener> lifecycleListeners =
            Collections.newSetFromMap(new WeakHashMap<LifecycleListener, Boolean>());
    //已启动
    private boolean isStarted;
    //已销毁
    private boolean isDestroyed;

    @Override
    public void addListener(LifecycleListener listener) {
        lifecycleListeners.add(listener);
        if (isDestroyed) {
            listener.onDestroy();
        } else if (isStarted) {
            listener.onStart();
        } else {
            listener.onStop();
        }
    }

    @Override
    public void removeListener(LifecycleListener listener) {
        lifecycleListeners.remove(listener);
    }

    void onStart() {
        isStarted = true;
        for (LifecycleListener lifecycleListener : lifecycleListeners) {
            lifecycleListener.onStart();
        }
    }

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

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

ActivityFragmentLifecycle这个类会在SupportRequestManagerFragment的构造函数中被创建

    public SupportRequestManagerFragment() {
        lifecycle = new ActivityFragmentLifecycle();
    }

Fragment在执行相应的生命周期的时候,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();
    }

在ActivityFragmentLifecycle中对应的方法如下:

    void onStart() {
        isStarted = true;
        for (LifecycleListener lifecycleListener : lifecycleListeners) {
            lifecycleListener.onStart();
        }
    }

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

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

也就是遍历所有的监听,执行相应onStart,onStop,onDestory方法

Glide的生命周期就是如此实现的,欢迎大家提问和纠错!

Glide框架解析---生命周期的介绍(四)Glide框架解析---生命周期的介绍(四) 紫气东来_life 发布了51 篇原创文章 · 获赞 38 · 访问量 1万+ 私信 关注
上一篇:Cmake & Visual Studio supports GoogleTest


下一篇:在Linux中使用selenium(环境部署)