Frescoソース分析(二)Fresco.initializeDrawee()分析続き

8687 ワード

4.2.1.2 Fresco.initializeDrawee()のプロセス続き


前回のブログの分析を続けますFresco.initializeDrawee()
    sDraweeControllerBuilderSupplier = new PipelineDraweeControllerBuilderSupplier(context);
    SimpleDraweeView.initialize(sDraweeControllerBuilderSupplier);
  • sDraweeControllerBuilderSupplier
  • を初期化
  • このsDraweeControllerBuilderSupplierを使用してSimpleDraweeView
  • を初期化します.
    やはり古い分析の構想です:一歩一歩分析します

    4.2.1.2.1 sDraweeControllerBuilderSupplier初期化プロセス

    public PipelineDraweeControllerBuilderSupplier(Context context) {
        this(context, ImagePipelineFactory.getInstance());
      }
    
      public PipelineDraweeControllerBuilderSupplier(
          Context context,
          ImagePipelineFactory imagePipelineFactory) {
        this(context, imagePipelineFactory, null);
      }
    
      public PipelineDraweeControllerBuilderSupplier(
          Context context,
          ImagePipelineFactory imagePipelineFactory,
          Set<ControllerListener> boundControllerListeners) {
        mContext = context;
        mImagePipeline = imagePipelineFactory.getImagePipeline();
        mPipelineDraweeControllerFactory = new PipelineDraweeControllerFactory(
            context.getResources(),
            DeferredReleaser.getInstance(),
            imagePipelineFactory.getAnimatedDrawableFactory(),
            UiThreadImmediateExecutorService.getInstance());
        mBoundControllerListeners = boundControllerListeners;
      } 

    コンストラクションメソッド
  • は、ImagePipelineFactoryのインスタンスを取得し、ソースコードを表示することによって、Frescoの最初のステップ初期化におけるImagePipelineFactoryのみを取得し、このインスタンスを取得した.ここでは、単例の形式
  • を採用する.
  • ImagePiplelineを取得し、このSupplierに保存されています.この中のコードはこれだけの行のように見えますが、含まれている内容が多いので、まず広さから見て、それから深さから見ます(この面は残されたQ 2として、後で見ます)***ImagePipelineFactory.getImagePipeline()ソースコード***public ImagePipeline getImagePipeline(){if(mImagePipeline==null){mImagePipeline=new ImagePipeline(getProducerSequenceFactory()、mConfig.getRequestListeners()、mConfig.get i g.get I m C r e t i g g g g g e t I s P r e tchEnabledSupplier()、getBitBitmamapMemoryCache()、getEncodedMemoryCache()、mConfig.Cagetg.Cafig.CagetgetchegCachecheyFactory((()、m));return mImagePipeline; }

  • 取得ImagePipeline()で、空の場合、
  • PipelineDraweeControllerFactoryが作成され、このSupplierに
  • が保存されます.
    ここを見て、私たちが先に続けた広さの分析は、SimpleDraweeViewを分析することです.initialize(s DraweeControllerBuilderSupplier)のプロセス

    4.2.1.2.2 SimpleDraweeView.initialize(s DraweeControllerBuilderSupplier)のプロセス


    上記の分析では、S D r a w e C o n t rollerBuilderSupplierがP i p e l i n e D r a w e C o llerBuilderSupplierを使用しているのを見ました.次に、SimpleDraweeViewを見てみましょう.Initialize(s DraweeControllerBuilderSupplier)のプロセスは次のコードから見られます.sDraweeControllerBuilderSupplierはSimpleDraweeViewに保存されています.SimpleDraweeViewは簡単に使用できます.Frescoがここで多くのものを初期化するのに役立つからです.
      private static Supplier<? extends SimpleDraweeControllerBuilder> sDraweeControllerBuilderSupplier;
    
      /** Initializes {@link SimpleDraweeView} with supplier of Drawee controller builders. */
      public static void initialize(
          Supplier<? extends SimpleDraweeControllerBuilder> draweeControllerBuilderSupplier) {
        sDraweeControllerBuilderSupplier = draweeControllerBuilderSupplier;
      }

    次に、SimpleDraweeViewのxml解析で初期化のプロセスを解析し、ここではsDraweeControllerBuilderSupplierのgetメソッド***SimpleDraweeViewのxml構造方式ソースコード解析***を呼び出すことを発見した.
      public SimpleDraweeView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
      }
    
      private void init() {
        if (isInEditMode()) {
          return;
        }
        Preconditions.checkNotNull(
            sDraweeControllerBuilderSupplier,
            "SimpleDraweeView was not initialized!");
        mSimpleDraweeControllerBuilder = sDraweeControllerBuilderSupplier.get();
      }

    焦らないで、xml解析を使用する方法で、setImageUriメソッドも使用しました.次にこのメソッドを見て、setImageUriでDraweeControllerを作成し、自身に設定しました.DraweeControllerを構築するとき、mSimpleDraweeControllerBuilderのbuild()メソッドを呼び出したことに気づきました.
    ***setImageURI(Uri)のソースコード解析***
      /**
       * Displays an image given by the uri.
       *
       * @param uri uri of the image
       * @undeprecate
       */
      @Override
      public void setImageURI(Uri uri) {
        setImageURI(uri, null);
      }
    
      /**
       * Displays an image given by the uri.
       *
       * @param uri uri of the image
       * @param callerContext caller context
       */
      public void setImageURI(Uri uri, @Nullable Object callerContext) {
        DraweeController controller = mSimpleDraweeControllerBuilder
            .setCallerContext(callerContext)
            .setUri(uri)
            .setOldController(getController())
            .build();
        setController(controller);
      }

    ここで、まずまとめてみましょう.
  • SimpleDraweeViewのsDraweeControllerBuilderSupplierはPipelineDraweeControllerBuilderSupplier
  • です.
  • SimpleDraweeViewのcontrollerは何ですか?では、ここでsDraweeControllerBuilderSupplierのgetを見て、ControllerBuilderは何ですか?
  • 対応のControllerBuilder、buildは何を出しますかcontroller
  • controllerはまたどのように要求の
  • を提出します
  • が残したQ 2問題はいつ
  • を分析することができますか?
    このいくつかの問題を見て、私たちの分析は、責任が重くて道が遠いことを発見しました.

    4.2.1.2.3 PipelineDraweeControllerBuilderSupplierのget()分析


    ここではPipelineDraweeControllerBuilderを作成しただけで、このbuilderはimagePipelineとmPipelineDraweeControllerFactoryを保存しています.
    *** PipelineDraweeControllerBuilder.get()分析***@O v e r ride public PipelineDraweeControllerBuilder get(){return new PipelineDraweeControllerBuilder(mContext,mPipelineDraweeControllerFactory,mImagePipeline,mBoundControllerListeners);
    ***PipelineDraweeControllerBuilderの構築方法***ここでは、何も見えないので、build()メソッドを見続けましょうpublic PipelineDraweeControllerBuilder(Context context,PipelineDraweeControllerFactory pipelineDraweeControllerFactory,ImagePiline imagePipeline,Set
    boundControllerListeners) {
    super(context, boundControllerListeners);
    mImagePipeline = imagePipeline;
    mPipelineDraweeControllerFactory = pipelineDraweeControllerFactory;
    }
    ビルドメソッドを表示すると、このPipelineDraweeControllerBuilderの継承構造が表示されます.
    AbstractDraweeControllerBuilder--| VolleyDraweeControllerBuilder--| PipelineDraweeControllerBuilder
    Volley関連の私たちは見ないで、これはVolleryのフレームワークと結合して使用して、興味があって自分で研究することができて、大同小異
    今回はメソッド呼び出しから直接見ればいいのですが、今回はリクエストがどのように発生したのかを見てみましょう.
    *** AbstractDraweeControllerBuilder.build()メソッドのソースコードは***非コアコードを分析します.今回は無視します.私たちの主な目的はどのように要求を送信するかを見て、後の要求がどのようにフロントにフィードバックするかを見て、他のコードがbuildの中で最も重要なのはbuildController()で、buildControllerの中で、最もコアなのはobtainController()で、それから他のは要求を設定するいくつかの情報です.例えば、要求のImageRequestを設定します.その他は再試行の設定など
      /** Builds the specified controller. */
      @Override
      public AbstractDraweeController build() {
        validate();
    
        // if only a low-res request is specified, treat it as a final request.
        if (mImageRequest == null && mMultiImageRequests == null && mLowResImageRequest != null) {
          mImageRequest = mLowResImageRequest;
          mLowResImageRequest = null;
        }
    
        return buildController();
      }
    
    
      /** Builds a regular controller. */
      protected AbstractDraweeController buildController() {
        AbstractDraweeController controller = obtainController();
        maybeBuildAndSetRetryManager(controller);
        maybeAttachListeners(controller);
        return controller;
      }
    
      /** Concrete builder classes should override this method to return a new controller. */
      protected abstract AbstractDraweeController obtainController();

    ここで、obtainController()が抽象的な方法であることを発見しました.それはサブクラスを探すことです.***PipelineDraweeControllerBuilder.ObtainController()ソース分析***コントロールを取得する方法では、最初の初期化を例に挙げます.elseの部分です.ここでは、mPipelineDraweControllerFactoryを使用して、newController@Override protected PipelineDraweController obtainController(){DraweController oldController=getoldController();PipelineDraweController Controller;if(oldController instanceof PipelineDraweController){controlller=(PipelineDraweController)oldController;troller.initialize(obtainDataSourceSupplier(), generateUniqueControllerId(), getCallerContext()); } else { controller = mPipelineDraweeControllerFactory.newController( obtainDataSourceSupplier(), generateUniqueControllerId(), getCallerContext()); } return controller; }
    この肝心な分析はもう重点になっているからだ.
      controller = mPipelineDraweeControllerFactory.newController(
          obtainDataSourceSupplier(),
          generateUniqueControllerId(),
          getCallerContext());

    一歩一歩見てみましょう
  • obtainDataSourceSupplier()は、DataSourceSupplier
  • を取得しました.
  • それからmPipelineDraweeControllerFactoryクラスnew controller
  • これも何も見えませんね.次の節では、DraweeControllerとここのSupplierの直接的な関係を結びつけなければなりません.では、基本的なリクエストの流れは、基本的な分析の終わりです.