当前位置:网站首页>Glide监听Activity生命周期源码分析
Glide监听Activity生命周期源码分析
2022-08-10 22:13:00 【AD钙奶-lalala】
为了分析Glide源码,我们需要先引入Glide。新建一个项目,在app.build里面引入:
dependencies {
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
implementation 'com.github.bumptech.glide:glide:3.7.0' //Glide
}
Glide基本用法:
Glide.with(this).load(url).into(imageView);
Glide的基本用法就不讲了,我们先来看Glide.with方法:
public static RequestManager with(Activity activity) {
RequestManagerRetriever retriever = RequestManagerRetriever.get();
return retriever.get(activity);
}
RequestManager可以理解为Glide的管理类,而RequestManagerRetriever可以理解为管理RequestManager的类。我们来看下retriever的英文意思:
我们进上面的方法第一个get看下:
public static RequestManagerRetriever get() {
return INSTANCE;
}
再来看下这个INSTANCE是什么东西?
private static final RequestManagerRetriever
INSTANCE = new RequestManagerRetriever();
很明显,这是一个单例。
我们再进第二个get里面看下实现:
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public RequestManager get(Activity activity) {
if (Util.isOnBackgroundThread() ||
Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
return get(activity.getApplicationContext());
} else {
assertNotDestroyed(activity);
android.app.FragmentManager fm = activity.getFragmentManager();
return fragmentGet(activity, fm);
}
}
if语句里面的判断条件意思是后台线程或者SDK版本号小于11,所以我们关注else里面代码。
断言activity没有被销毁,获取activity的FragmentManager,将activity和fm作为参数传到fragmentGet方法中:
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
RequestManager fragmentGet(Context context,
android.app.FragmentManager fm) {
RequestManagerFragment current = getRequestManagerFragment(fm);//1
RequestManager requestManager = current.getRequestManager();
if (requestManager == null) {
requestManager = new RequestManager(context,
current.getLifecycle(), current.getRequestManagerTreeNode());
current.setRequestManager(requestManager);
}
return requestManager;
}
先来看注释1:
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
RequestManagerFragment getRequestManagerFragment(
final android.app.FragmentManager fm) {
RequestManagerFragment current =
(RequestManagerFragment) fm.findFragmentByTag(FRAGMENT_TAG);
if (current == null) {
current = pendingRequestManagerFragments.get(fm);
if (current == null) {
current = new RequestManagerFragment();
pendingRequestManagerFragments.put(fm, current);
fm.beginTransaction()
.add(current, FRAGMENT_TAG).commitAllowingStateLoss();
handler
.obtainMessage(ID_REMOVE_FRAGMENT_MANAGER, fm).sendToTarget();
}
}
return current;
}
先来通过Tag找这个Fragment,如果没找到,再去pending~里面找(HashMap),如果还没有找到,就创建一个对象,然后加到activity里面。
来看RequestManagerFragment:
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class RequestManagerFragment extends Fragment {
private final ActivityFragmentLifecycle lifecycle;
private RequestManager requestManager;
···
public RequestManagerFragment() {
this(new ActivityFragmentLifecycle());
}
// For testing only.
@SuppressLint("ValidFragment")
RequestManagerFragment(ActivityFragmentLifecycle lifecycle) {
this.lifecycle = lifecycle;
}
/**
* Sets the current {@link com.bumptech.glide.RequestManager}.
*
* @param requestManager The request manager to use.
*/
public void setRequestManager(RequestManager requestManager) {
this.requestManager = requestManager;
}
ActivityFragmentLifecycle getLifecycle() {
return lifecycle;
}
/**
* Returns the current {@link com.bumptech.glide.RequestManager} or null if none exists.
*/
public RequestManager getRequestManager() {
return requestManager;
}
@Override
public void onStart() {
super.onStart();
lifecycle.onStart();
}
@Override
public void onStop() {
super.onStop();
lifecycle.onStop();
}
@Override
public void onDestroy() {
super.onDestroy();
lifecycle.onDestroy();
}
···
}
只保留了一些核心代码,一起来看下这些核心代码解释。
我们再来重点看RequestManager的构造方法:
new RequestManager(context,
current.getLifecycle(), current.getRequestManagerTreeNode());
public RequestManager(Context context, Lifecycle lifecycle,
RequestManagerTreeNode treeNode) {
this(context, lifecycle, treeNode,
new RequestTracker(), new ConnectivityMonitorFactory());
}
RequestManager(Context context,
final Lifecycle lifecycle,
RequestManagerTreeNode treeNode,
RequestTracker requestTracker,
ConnectivityMonitorFactory factory) {
this.context = context.getApplicationContext();
this.lifecycle = lifecycle;
this.treeNode = treeNode;
this.requestTracker = requestTracker;
this.glide = Glide.get(context);
this.optionsApplier = new OptionsApplier();
ConnectivityMonitor connectivityMonitor = factory.build(context,
new RequestManagerConnectivityListener(requestTracker));
// If we're the application level request manager, we may be created on a background thread. In that case we
// cannot risk synchronously pausing or resuming requests, so we hack around the issue by delaying adding
// ourselves as a lifecycle listener by posting to the main thread. This should be entirely safe.
if (Util.isOnBackgroundThread()) {
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
lifecycle.addListener(RequestManager.this);
}
});
} else {
lifecycle.addListener(this);//1
}
lifecycle.addListener(connectivityMonitor);
}
传入了此Fragment的lifecycle,很明显这个lifecycle就是ActivityFragmentLifecycle。
我们再来看下这个类的源码:
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();
}
}
void onStart() {
isStarted = true;
for (LifecycleListener
lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
lifecycleListener.onStart();
}
}
void onStop() {
isStarted = false;
for (LifecycleListener
lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
lifecycleListener.onStop();
}
}
void onDestroy() {
isDestroyed = true;
for (LifecycleListener
lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
lifecycleListener.onDestroy();
}
}
}
我们来理一理:Glide.with()里面传入一个activity,with方法里面先通过单例获取一个RequestManagerRetriever对象,然后通过这个对象的get方法获取一个RequestManager对象。
而RequestManager初始化的时候传入的Lifecycle对象会调用addListener将RequestManager传入。我们来看RequestManagerFragment的生命周期里面调用:
@Override
public void onStart() {
super.onStart();
lifecycle.onStart();
}
@Override
public void onStop() {
super.onStop();
lifecycle.onStop();
}
@Override
public void onDestroy() {
super.onDestroy();
lifecycle.onDestroy();
}
每当fragment这几个生命周期触发的时候,就会调用ActivityFragmentLifecycle的对应方法。
void onStart() {
isStarted = true;
for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
lifecycleListener.onStart();
}
}
void onStop() {
isStarted = false;
for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
lifecycleListener.onStop();
}
}
void onDestroy() {
isDestroyed = true;
for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
lifecycleListener.onDestroy();
}
}
这里面有调用了LifecycleListener的对应方法,典型的接口回调。Util.getSnapshot代码:
public static <T> List<T> getSnapshot(Collection<T> other) {
List<T> result = new ArrayList<T>(other.size());
for (T item : other) {
result.add(item);
}
return result;
}
将Set转化成集合,其实目前的使用来看这个集合就一个对象,就是RequestManager对象。我们才想RequestManager肯定实现了LifecycleListener接口:
RequestManager implements LifecycleListener
@Override
public void onStart() {
resumeRequests();
}
@Override
public void onStop() {
pauseRequests();
}
@Override
public void onDestroy() {
requestTracker.clearRequests();
}
来做一个总结吧:通过Glide.with(Activity activity)会获取一个RequestManager对象,具体with方法是这样的:先通过单例获取一个RequestManagerRetriever,然后调用这个对象的get方法返回一个RequestManager对象,这个get方法里面又获取了activity的FragmentManager,然后又将activity和这个fm传入fragmentGet方法中,这个fragmentGet里面创建了一个无界面的fragment,然后这个fargment里面持有ActivityFragmentLifecycle,这个lifecycle就监听了无界面fragment的生命周期。fragmentGet里面还做了一件事,就是将这个获取到的fragment再拿到这个fragment的lifecycle,传入RequestManager构造并返回RequestManager对象。RequestManager构造里面有一个lifecycle.addListener方法很重要,将RequestManager对象本身传入。这样fragment生命周期变化->lifecyle对应方法触发->lifecycleListener接口回调->lifecycleListener接口实现类RequestManager对应方法触发。
边栏推荐
猜你喜欢
FPGA - Memory Resources of 7 Series FPGA Internal Structure -03- Built-in Error Correction Function
威纶通触摸屏如何在报警的同时,显示出异常数据的当前值?
使用 Cloudreve 搭建私有云盘
Black cats take you learn Makefile article 13: a Makefile collection compile problem
What are the concepts, purposes, processes, and testing methods of interface testing?
geemap的详细安装步骤及环境配置
GMT,UTC,CST,DST,RTC,NTP,SNTP,NITZ: 嵌入式的时间
链表相加(二)
Shell 编程--Sed
H3C S5130 IRF做堆叠
随机推荐
阿里云贾朝辉:云XR平台支持彼真科技呈现国风科幻虚拟演唱会
Shell编程之条件语句(二)
美味石井饭菜
68: Chapter 6: Develop article services: 1: Content sorting; article table introduction; creating [article] article services;
Thread State 详解
win系统下pytorch深度学习环境安装
LabVIEW分配多少线程?
Qualcomm Platform Development Series Explanation (Application) Introduction to QCMAP Application Framework
阿里云张新涛:支持沉浸式体验应用快速落地,阿里云云XR平台发布
CIKM2022 | Sequence Recommendation Based on Bidirectional Transformers Contrastive Learning
美味的石井饭
高通平台开发系列讲解(应用篇)QCMAP应用框架介绍
QT笔记——用VS + qt 生成dll 和 调用生成的dll
Shell编程规范与变量
OneNote tutorial, how to organize notebooks in OneNote?
file IO-buffer
这款可视化工具神器,更直观易用!太爱了
The Thread State,
Merge k sorted linked lists
美味的佳肴