Frescoソース分析(二)Fresco.initializeDrawee()分析続き
8687 ワード
4.2.1.2 Fresco.initializeDrawee()のプロセス続き
前回のブログの分析を続けますFresco.initializeDrawee()
sDraweeControllerBuilderSupplier = new PipelineDraweeControllerBuilderSupplier(context);
SimpleDraweeView.initialize(sDraweeControllerBuilderSupplier);
やはり古い分析の構想です:一歩一歩分析します
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;
}
コンストラクションメソッド
取得ImagePipeline()で、空の場合、
ここを見て、私たちが先に続けた広さの分析は、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);
}
ここで、まずまとめてみましょう.
このいくつかの問題を見て、私たちの分析は、責任が重くて道が遠いことを発見しました.
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());
一歩一歩見てみましょう