Gilde 的使用
最基礎的使用
Glide.with(context).load(url).into(imageView)
with方法
Glide.with(context)
with 重載方法
with(android.app.Activity)
with(android.app.Fragment)
with(android.support.v4.app.Fragment)
with(android.support.v4.app.FragmentActivity)
with(android.view)
with 方法返回的都是一個RequestManager對象,RequestManager 是管理請求的
@NonNull
public static RequestManager with(@NonNull Activity activity) {
return getRetriever(activity).get(activity);
}
get 方法 根據不同的context 返回不同的RequestManager
public RequestManager get(Context context) {
if (context == null) {
throw new IllegalArgumentException("You cannot start a load on a null Context");
} else if (Util.isOnMainThread() && !(context instanceof Application)) {
if (context instanceof FragmentActivity) {
return get((FragmentActivity) context);
} else if (context instanceof Activity) {
return get((Activity) context);
} else if (context instanceof ContextWrapper) {
return get(((ContextWrapper) context).getBaseContext());
}
}
return getApplicationManager(context);
}
如果context是activity ,繼續看
public RequestManager get(@NonNull Activity activity) {
if (Util.isOnBackgroundThread()) {
// 如果不是主線程,則context對象轉爲ApplicationContext,然後也不做綁定生命週期的操作,
// 圖片加載的生命週期默認爲Application的生命週期
return get(activity.getApplicationContext());
} else {
assertNotDestroyed(activity);
//(1)
android.app.FragmentManager fm = activity.getFragmentManager();
return fragmentGet(activity, fm, null /*parentHint*/);
}
}
- (1)處通過activity 獲取了FragmentManager 並傳給了fragmentGet方法
fragmentGet 方法
private RequestManager fragmentGet(@NonNull Context context,
@NonNull android.app.FragmentManager fm,
@Nullable android.app.Fragment parentHint) {
//(1)
RequestManagerFragment current = getRequestManagerFragment(fm, parentHint);
RequestManager requestManager = current.getRequestManager();
......
return requestManager;
}
- (1)處 獲取到一個無UI的Fragment,用來綁定Activity從而實現生命週期同步
創建Fragment 的原因
- 因爲glide無法直接獲取activity的生命週期,通過activity的FragmentManager中加入一個隱藏的fragment,因爲fragment與傳入的activity生命週期一致,所以只要監聽這個RequestManagerFragment就能實現生命週期管理
接下來 getRequestManagerFragment 創建fragment
RequestManagerFragment getRequestManagerFragment(
@NonNull final android.app.FragmentManager fm, @Nullable android.app.Fragment parentHint) {
//(1)
RequestManagerFragment current = (RequestManagerFragment) fm.findFragmentByTag(FRAGMENT_TAG);
//(2)
if (current == null) {
current = pendingRequestManagerFragments.get(fm);
if (current == null) {//(3)
current = new RequestManagerFragment();
......
}
}
return current;
}
- (1)處 這個Fragment是個無UI的Fragment,可以通過findFragmentByTag(FRAGMENT_TAG)去查找這個RequestManagerFragment
- (2)處 如果第一次進來,current就是null,如果已經創建過,可以通過fm對象找到已有的fragment對象,如果再沒有(3)就創建一個RequestManagerFragment
接下來RequestManagerFragment 的構造方法
public class SupportRequestManagerFragment extends Fragment {
public SupportRequestManagerFragment() {
//(1)
this(new ActivityFragmentLifecycle());
}
@SuppressLint("ValidFragment")
public SupportRequestManagerFragment(ActivityFragmentLifecycle lifecycle) {
//(2)
this.lifecycle = lifecycle;
}
ActivityFragmentLifecycle getGlideLifecycle() {
return lifecycle;
}
@Override
public void onStart() {
super.onStart();
lifecycle.onStart();//(3)
}
@Override
public void onStop() {
super.onStop();
lifecycle.onStop();//(4)
}
@Override
public void onDestroy() {
super.onDestroy();
lifecycle.onDestroy();//(5)
}
}
- (1)處 初始化Fragment的時候也順便初始化了ActivityFragmentLifecycle
- (2)處 lifecycle賦值 ActivityFragmentLifecycle
- (3)(4)(5) 處都是fragement 生命週期的回調方法,在生命週期方法中調用ActivityFragmentLifecycle 的生命週期方法
看下ActivityFragmentLifecycle
class ActivityFragmentLifecycle implements Lifecycle {
@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 : 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();
}
}
}
public interface Lifecycle {
void addListener(LifecycleListener listener);
void removeListener(LifecycleListener listener);
}
- ActivityFragmentLifecycle 實現了Lifecycle
- 對外暴露一個addListener方法,可以監聽生命週期的變化
- ActivityFragmentLifecycle 中的生命週期方法又調用了傳遞進來的lifecycleListener 的生命週期方法
看下哪裏調用了addListener ,在開始的fragmentGet中
private RequestManager fragmentGet(@NonNull Context context,
@NonNull android.app.FragmentManager fm,
@Nullable android.app.Fragment parentHint) {
RequestManagerFragment current = getRequestManagerFragment(fm, parentHint);
RequestManager requestManager = current.getRequestManager();
if (requestManager == null) {
Glide glide = Glide.get(context);
//(1)
requestManager = factory.build(
glide, current.getGlideLifecycle(), current.getRequestManagerTreeNode(), context);
current.setRequestManager(requestManager);
}
return requestManager;
}
- (1) 處 傳入的current.getGlideLifecycle() 就是Lifecycle ,而lifecycle正是ActivityFragmentLifecycle。
RequestManagerFactory
public interface RequestManagerFactory {
@NonNull
RequestManager build(
@NonNull Glide glide,
@NonNull Lifecycle lifecycle,
@NonNull RequestManagerTreeNode requestManagerTreeNode,
@NonNull Context context);
}
private static final RequestManagerFactory DEFAULT_FACTORY = new RequestManagerFactory() {
@NonNull
@Override
public RequestManager build(@NonNull Glide glide, @NonNull Lifecycle lifecycle,
@NonNull RequestManagerTreeNode requestManagerTreeNode, @NonNull Context context) {
// (1)
return new RequestManager(glide, lifecycle, requestManagerTreeNode, context);
}
};
- (1) 處 初始化了RequestManager
看下 RequestManager
public class RequestManager implements LifecycleListener {
RequestManager(
Glide glide,
Lifecycle lifecycle,
RequestManagerTreeNode treeNode,
RequestTracker requestTracker,
ConnectivityMonitorFactory factory,
Context context) {
this.glide = glide;
this.lifecycle = lifecycle;
this.treeNode = treeNode;
this.requestTracker = requestTracker;
this.context = context;
if (Util.isOnBackgroundThread()) {
mainHandler.post(addSelfToLifecycle);
} else {
// (1)
lifecycle.addListener(this);
}
}
...
@Override
public void onDestroy() {
targetTracker.onDestroy();
for (Target<?> target : targetTracker.getAll()) {
clear(target);
}
targetTracker.clear();
requestTracker.clearRequests();
lifecycle.removeListener(this);
lifecycle.removeListener(connectivityMonitor);
mainHandler.removeCallbacks(addSelfToLifecycle);
glide.unregisterRequestManager(this);
}
}
- (1)處 調用lifecycle.addListener(this); 實現了與RequestManagerFragment生命週期的綁定