Glide는 페이지의 생명 주기를 어떻게 연결합니까?
9237 단어 지식 요점
과정을 간단하게 설명하면 전체 과정에 대해 대체적인 인상을 가지게 된다. 그렇지 않으면 원본 코드를 보면 북쪽을 찾을 수 없다.바인딩의 전반적인 절차: Glide-> RequestManagerRetriever-> RequestManagerFragment-> ActivityFragmentLifecycle -> RequestManager -> RequestTracker
귀속을 어떻게 완성하는가가 가장 관건입니다. 여기서 우리는 주로Activity를 과정으로 하고 귀속을 이해하며 다른 것은 이런 식으로 유추할 수 있습니다.우선 우리는 가장 익숙한 사용부터 Glide를 시작한다.with(imageView.getContext())
Glide
public RequestManager get(@NonNull 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);
}
이어서 get 방법에 들어가서 보기
RequestManagerRetriever
public static RequestManager with(@NonNull Activity activity) {
return getRetriever(activity).get(activity);
}
public RequestManager get(@NonNull Activity activity) {
// , ,
if (Util.isOnBackgroundThread()) {
return get(activity.getApplicationContext());
} else {
assertNotDestroyed(activity);
android.app.FragmentManager fm = activity.getFragmentManager();
return fragmentGet(
activity, fm, /*parentHint=*/ null, isActivityVisible(activity)); //
}
}
여기에서 우리는 페이지의 생명주기만 볼 수 있기 때문에fragmentGet의 내용을 본다
RequestManagerRetriever # fragmentGet
private RequestManager fragmentGet(@NonNull Context context,
@NonNull android.app.FragmentManager fm,
@Nullable android.app.Fragment parentHint,
boolean isParentVisible) {
// Fragment ,
RequestManagerFragment current = getRequestManagerFragment(fm, parentHint, isParentVisible);
RequestManager requestManager = current.getRequestManager(); // RequestManager
if (requestManager == null) {
// TODO(b/27524013): Factor out this Glide.get() call.
Glide glide = Glide.get(context);
requestManager =
factory.build(
glide, current.getGlideLifecycle(), current.getRequestManagerTreeNode(), context);// Fragment RequestManager
current.setRequestManager(requestManager); // RequestManager Fragment
}
return requestManager;
}
private RequestManagerFragment getRequestManagerFragment(@NonNull final android.app.FragmentManager fm, @Nullable android.app.Fragment parentHint,boolean isParentVisible) {
RequestManagerFragment current = (RequestManagerFragment)fm.findFragmentByTag(FRAGMENT_TAG);
if (current == null) {
current = pendingRequestManagerFragments.get(fm);
if (current == null) {
current = new RequestManagerFragment(); // , Fragment RequestManagerFragment
current.setParentFragmentHint(parentHint);
if (isParentVisible) {
current.getGlideLifecycle().onStart();
}
pendingRequestManagerFragments.put(fm, current);
fm.beginTransaction().add(current, FRAGMENT_TAG).commitAllowingStateLoss();
handler.obtainMessage(ID_REMOVE_FRAGMENT_MANAGER, fm).sendToTarget();
}
}
return current;
}
여기에는 빈 Fragment와 Request Manager 대상을 만들고 Fragment의 생명주기를 Request Manager에 전달하고 Request Manager를 Fragment에 전달합니다.
여기에서 주로 이루어진 일: Request Manager Retriever를 통해 Fragment와 Request Manager를 연결합니다.어떻게 묶었는지 구체적으로 말씀드리겠습니다.
----------구체적인 귀속 과정 --------
먼저 새로 만든 빈 Fragment에서 말하자면, 그 구체적인 실현 클래스는 Request Manager Fragment입니다. 만들 때Activity Fragment Lifecycle을 동시에 만들었습니다.
RequestManagerFragment
public RequestManagerFragment() {
this(new ActivityFragmentLifecycle());
}
@VisibleForTesting
@SuppressLint("ValidFragment")
RequestManagerFragment(@NonNull ActivityFragmentLifecycle lifecycle) {
this.lifecycle = lifecycle;
}
다음은 관건 코드입니다. 이 안에는ActivityFragmentLifecycle의 상응하는 방법이 호출됩니다.
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();
unregisterFragmentWithRoot();
}
Activity Fragment Lifecycle의 몇 가지 관건적인 방법을 살펴보겠습니다.
public void addListener(@NonNull 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();
}
}
위의 코드에서 우리는 라이프스케일 리스트의 상응하는 방법을 호출한 것을 보았는데 이 라이프스케일 리스트의 실현 클래스는 누구입니까?우리는 라이프스케일 리스트를 보았다.onStart(); 이lifecycle Listeners는lifecycle Listeners의 용기에서 꺼낸 것이고,lifecycle Listeners는add Listeners에 추가된 것이다.이 때 우리는addListener가 누가 호출되었는지 알고 싶다. 호출된 클래스(AS에서 제공된)를 볼 수 있는 방법을 누르면 Request Manager라는 것을 알 수 있다. 그렇다. 우리는 다음과 같은 코드를 보았다.
public class RequestManager implements LifecycleListener,ModelTypes> {
...
RequestManager(
Glide glide,
Lifecycle lifecycle,
RequestManagerTreeNode treeNode,
RequestTracker requestTracker,
ConnectivityMonitorFactory factory,
Context context) {
···
if (Util.isOnBackgroundThread()) {
mainHandler.post(addSelfToLifecycle);
} else {
lifecycle.addListener(this); //
}
lifecycle.addListener(connectivityMonitor);
setRequestOptions(glide.getGlideContext().getDefaultRequestOptions());
glide.registerRequestManager(this);
}
이때 우리는 이전에 보았던 코드를 회상해 보았는데, 사실 우리가 Request Manager 대상을 만들었을 때current.getGlideLifecycle ()는fragment의ActivityFragmentLifecycle을 전송했습니다.코드는 다음과 같습니다.
RequestManagerRetriever # fragmentGet
requestManager =
factory.build(
glide, current.getGlideLifecycle(), current.getRequestManagerTreeNode(), context);
자, 알겠습니다.Activity Fragment Lifecycle의 방법은 Request Manager의 방법을 사용합니다. 예를 들어 위의lifecycle Listener입니다.onStart();Request Manager #onStart 가 실제로 호출됩니다.그러면 Request Manager의 클래스를 살펴보겠습니다.
RequestManager
public void onStart() {
resumeRequests();
targetTracker.onStart();
}
public void onStop() {
pauseRequests();
targetTracker.onStop();
}
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);
}
온스타트를 봅시다. 다른 방법은pause Requests () 를 호출할 것입니다.안쪽을 보고 무엇을 했습니까?
RequestManager
public void resumeRequests() {
Util.assertMainThread();
requestTracker.resumeRequests();
}
RequestTracker를 계속 누르십시오.resumeRequests(); 저희가 다음 코드를 봤어요.
RequestTracker
public void resumeRequests() {
isPaused = false;
for (Request request : Util.getSnapshot(requests)) {
if (!request.isComplete() && !request.isRunning()) {
request.begin(); //
}
}
pendingRequests.clear();
}
request.begin(); 요청을 진행하는 것입니다. 즉, 우리glide가 진행하는 작업입니다.여기까지만 생명주기가 시작되는 귀속을 완성하고 다른 방법, 예를 들어 온스톱(), 온데스트로(onDestroy)을 보면 사실은 Glide의 정지와 종료를 실행하는 작업이다.이 귀속 과정이 이렇습니다. 보고 나니 좀 시원하지 않습니까?
핵심류의 역할
조금이나마 도움이 된다면 기쁜 일이다.
내 csdn:http://blog.csdn.net/shenshizhong나의 약서:http://www.jianshu.com/u/345daf0211ad