Glide는 페이지의 생명 주기를 어떻게 연결합니까?

9237 단어 지식 요점
문서 목록
  • 앞말
  • 간략한 설명 과정
  • 귀속을 어떻게 완성하나요
  • 핵심류의 역할
  • 요약
  • 앞에서 말했듯이 Glide는 매우 강력한 이미지 로드 프레임워크입니다. 기본적으로 모든 면접에서 질문을 받을 수 있습니다. 가장 많이 묻는 것은 페이지의 생명주기와 어떻게 연결되는지 하는 것입니다. 이 점을 감안하여 저는 정리를 했습니다. 저도 프로젝트를 하나 열었습니다. 안드로이드에 관한 면접 문제에 대해 필요한 것이 있으면 들어와서 보십시오.https://github.com/shenshizhong/AndroidIQ
    과정을 간단하게 설명하면 전체 과정에 대해 대체적인 인상을 가지게 된다. 그렇지 않으면 원본 코드를 보면 북쪽을 찾을 수 없다.바인딩의 전반적인 절차: 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의 정지와 종료를 실행하는 작업이다.이 귀속 과정이 이렇습니다. 보고 나니 좀 시원하지 않습니까?
    핵심류의 역할
  • RequestManagerFragment: UI가 없는fragment를 구현합니다.
  • ActivityFragmentLifecycle: UI가 없는fragment를 통해 RequestManager
  • 를 호출합니다
  • RequestManager: 관건적인 몇 가지 방법을 실현하여glide의 조작을 호출하기
  • Request Manager Retriever: 다리로서 Request Manager Fragment와 Request Manager를 연결시킨다
  • 총괄: 전체적인 과정은 빈 Request Manager Fragment의 생명주기는Activity Fragment Lifecycle를 호출한 다음에Activity Fragment Lifecycle는 Request Manager를 호출하고 Request Tracker의glide 조작을 호출하여 최종적으로gilde 조작을 실현하고 페이지의 생명주기에 따라 해당하는 처리를 할 수 있다.
    조금이나마 도움이 된다면 기쁜 일이다.
    내 csdn:http://blog.csdn.net/shenshizhong나의 약서:http://www.jianshu.com/u/345daf0211ad

    좋은 웹페이지 즐겨찾기