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
@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()
- 其它生命周期同理