1、前言
- 从使用上来讲,Glide的确非常简单。
Glide.with(this).load("https://XXXX.jpg").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
@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
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) {
RequestManagerFragment requestManagerFragment = getRequestManagerFragment(fragmentManager);
RequestManager requestManager = requestManagerFragment.getRequestManager();
if(requestManager == null){
Glide glide = Glide.get(context);
requestManager = new RequestManager(glide,requestManagerFragment.getGlideLifecycle(),context);
requestManagerFragment.setRequestManager(requestManager);
}
return requestManager;
}
private RequestManagerFragment getRequestManagerFragment(
@NonNull final android.app.FragmentManager fragmentManager) {
RequestManagerFragment fragmentByTag = (RequestManagerFragment) fragmentManager.findFragmentByTag(FRAGMENT_TAG);
if(fragmentByTag == null){
fragmentByTag = pendingRequestManagerFragments.get(fragmentManager);
if(fragmentByTag == null){
fragmentByTag = new RequestManagerFragment();
pendingRequestManagerFragments.put(fragmentManager,fragmentByTag);
fragmentManager.beginTransaction().add(fragmentByTag,FRAGMENT_TAG).commitAllowingStateLoss();
handler.obtainMessage(ID_REMOVE_FRAGMENT_MANAGER).sendToTarget();
}
}
return fragmentByTag;
}
@Override
public boolean handleMessage(@NonNull Message msg) {
switch (msg.what){
case ID_REMOVE_FRAGMENT_MANAGER:
FragmentManager fm = (FragmentManager) msg.obj;
pendingRequestManagerFragments.remove(fm);
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();
}
}
@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()
- 其它生命周期同理