多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > Fresco源碼解析 - 初始化過程分析

Fresco源碼解析 - 初始化過程分析

來源:程序員人生   發布時間:2015-05-08 07:49:16 閱讀次數:3642次

使用Fresco之前,1定先要進行初始化,1般初始化的工作會在Application.onCreate()完成,固然也能夠在使用Drawee之前完成。

Fresco本身提供了兩種初始化方式,1種是使用使用默許配置初始化,另外一種是使用用戶自定義配置。

以下代碼是Fresco提供的兩個初始化方法。第1個只需要提供1個Context參數,第2個還需要提供 ImagePipeline 的配置實例 - ImagePipelineConfig

/** Initializes Fresco with the default config. */ public static void initialize(Context context) { ImagePipelineFactory.initialize(context); initializeDrawee(context); }
/** Initializes Fresco with the specified config. */ public static void initialize(Context context, ImagePipelineConfig imagePipelineConfig) { ImagePipelineFactory.initialize(imagePipelineConfig); initializeDrawee(context); }

先來分析1下第1種方式。

開始初始化

Fresco.initialized(context)

使用默許參數進行初始化

com.facebook.drawee.backends.pipeline.Fresco

/** Initializes Fresco with the default config. */ public static void initialize(Context context) { ImagePipelineFactory.initialize(context); initializeDrawee(context); }

其中 ImagePipeline 負責獲得圖象數據,可以是網絡圖片,也能夠是本地圖片。這里用1個 Factory - ImagePipelineFactory 來創建默許的 ImagePipleline

創建 ImagePipeline

com.facebook.imagepipeline.core.ImagePipelineFactory

/** Initializes {@link ImagePipelineFactory} with default config. */ public static void initialize(Context context) { initialize(ImagePipelineConfig.newBuilder(context).build()); }

ImagePipelineConfigImagePipeline的初始化工作提供了必須的參數,它的構建進程采取了Builder模式

ImagePipelineConfig 中包括了很多參數,由于我們調用 Fresco.initialize()的時候值傳遞了1個 context 參數,所以 Fresco 還沒有獲得任何用戶自定義的數據,因此全部使用默許值,Builder 類只提供了構建的進程,而默許值則需要等到新建 ImagePipelineConfig時創建。

通過 Builder 的部份源碼可以看出,初始化1個 ImagePipeline 需要很多參數,這些參數的具體意義會在后續的博文中介紹。

public static class Builder { private Supplier<MemoryCacheParams> mBitmapMemoryCacheParamsSupplier; private CacheKeyFactory mCacheKeyFactory; private final Context mContext; private Supplier<MemoryCacheParams> mEncodedMemoryCacheParamsSupplier; private ExecutorSupplier mExecutorSupplier; private ImageCacheStatsTracker mImageCacheStatsTracker; private ImageDecoder mImageDecoder; private Supplier<Boolean> mIsPrefetchEnabledSupplier; private DiskCacheConfig mMainDiskCacheConfig; private MemoryTrimmableRegistry mMemoryTrimmableRegistry; private NetworkFetcher mNetworkFetcher; private PoolFactory mPoolFactory; private ProgressiveJpegConfig mProgressiveJpegConfig; private Set<RequestListener> mRequestListeners; private boolean mResizeAndRotateEnabledForNetwork = true; private DiskCacheConfig mSmallImageDiskCacheConfig; private AnimatedImageFactory mAnimatedImageFactory; // other methods }

從 Fresco 的 initialize 方法中我們得知,ImagePipelineConfig 是這么創建的:

ImagePipelineConfig.newBuilder(context).build())

Builder 并沒有提供參數的默許值,那默許值肯定是在 buid() 方法完成賦值。

com.facebook.imagepipeline.core.ImagePipelineFactory$Builder

public ImagePipelineConfig build() { return new ImagePipelineConfig(this); }

由以上代碼可以看出,build()會創建1個 ImagePipelineConfig ,然后把 this 作為參數傳給構造函數,而ImagePipelineConfig 的構造函數就是根據 Builder 來初始化自己。

初始化的策略非常簡單:

  • 如果 builder 中的參數值為空,則使用默許值。
  • 如果 builder 中的參數值不為空,則使用 Builder 提供的值。

可以通過1個具體的參數來看1下,如果 builder.mBitmapMemoryCacheParamsSupplier 為空,則 new DefaultBitmapMemoryCacheParamsSupplier(),如果不空,則使用 builder.mBitmapMemoryCacheParamsSupplier

mBitmapMemoryCacheParamsSupplier = builder.mBitmapMemoryCacheParamsSupplier == null ? new DefaultBitmapMemoryCacheParamsSupplier( (ActivityManager) builder.mContext.getSystemService(Context.ACTIVITY_SERVICE)) : builder.mBitmapMemoryCacheParamsSupplier;

最后把這個 build 出來的 ImagePipelineConfig 實例傳給 ImagePipelineFactory 的靜態方法 initialize,完成初始化。

/** Initializes {@link ImagePipelineFactory} with the specified config. */ public static void initialize(ImagePipelineConfig imagePipelineConfig) { sInstance = new ImagePipelineFactory(imagePipelineConfig); }

ImagePipelineFactory 的實例 sInstance 會在初始化 Drawee 的時候用到。

初始化 Drawee

通過以上分析我們了解到,Fresco 會首先初始化 ImagePipeline,并把ImagePipeline 的實例保存在1個 ImagePipelineFactory 類型的靜態變量中 - sInstance;然后開始初始化 Drawee

private static void initializeDrawee(Context context) { sDraweeControllerBuilderSupplier = new PipelineDraweeControllerBuilderSupplier(context); SimpleDraweeView.initialize(sDraweeControllerBuilderSupplier); }

首先,new 1個 PipelineDraweeControllerBuilderSupplier,它是 PipelineDraweeControllerBuilder 的1個 SupplierSupplier不是由 JDK 提供的,而是 Fresco 直接從 guava 中移過來的,代碼簡單,只提供了1個 get 方法。

/** * A class that can supply objects of a single type. Semantically, this could * be a factory, generator, builder, closure, or something else entirely. No * guarantees are implied by this interface. * * @author Harry Heymann * @since 2.0 (imported from Google Collections Library) */ public interface Supplier<T> { /** * Retrieves an instance of the appropriate type. The returned object may or * may not be a new instance, depending on the implementation. * * @return an instance of the appropriate type */ T get(); }

顧名思義,Supplier 是1個提供者,用戶包括但不限于factory, generator, builder, closure,接口方法 get() 用于返回它所提供的實例,需要注意的是,這個實例可以是新建的,也能夠不是。

在這里,PipelineDraweeControllerBuilderSupplier 的用法更像是1個 Factory,它實現了 Supplier 接口。

public class PipelineDraweeControllerBuilderSupplier implements Supplier<PipelineDraweeControllerBuilder> { private final Context mContext; private final ImagePipeline mImagePipeline; private final PipelineDraweeControllerFactory mPipelineDraweeControllerFactory; private final Set<ControllerListener> mBoundControllerListeners; 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; } @Override public PipelineDraweeControllerBuilder get() { return new PipelineDraweeControllerBuilder( mContext, mPipelineDraweeControllerFactory, mImagePipeline, mBoundControllerListeners); } }

構造函數 PipelineDraweeControllerBuilderSupplier(Context context),使用了在 Frescoinitalize 方法中通過 ImagePipelineFactoryBuilder 創建的 ImagePipelineFactory 的實例。

this(context, ImagePipelineFactory.getInstance());

get 方法告知我們,ImagePipeline 會存儲在 PipelineDraweeController 中,關于 Controller 可以參考 Fresco源碼解析 - Hierarachy-View-Controller。

同時 PipelineDraweeController 也會存儲1個 mPipelineDraweeControllerFactory

public class PipelineDraweeControllerFactory { private Resources mResources; private DeferredReleaser mDeferredReleaser; private AnimatedDrawableFactory mAnimatedDrawableFactory; private Executor mUiThreadExecutor; public PipelineDraweeControllerFactory( Resources resources, DeferredReleaser deferredReleaser, AnimatedDrawableFactory animatedDrawableFactory, Executor uiThreadExecutor) { mResources = resources; mDeferredReleaser = deferredReleaser; mAnimatedDrawableFactory = animatedDrawableFactory; mUiThreadExecutor = uiThreadExecutor; } public PipelineDraweeController newController( Supplier<DataSource<CloseableReference<CloseableImage>>> dataSourceSupplier, String id, Object callerContext) { return new PipelineDraweeController( mResources, mDeferredReleaser, mAnimatedDrawableFactory, mUiThreadExecutor, dataSourceSupplier, id, callerContext); } }

這個 mPipelineDraweeControllerFactory 會通過 newController 來創建1個 PipelineDraweeController 的實例。

到底,初始化的工作就完成了。


以上分析雖然簡單,但是清楚地梳理了 Fresco 的初始化進程,不過任然是遠遠不夠的,由以上代碼可以看出,初始化對應組件(Drawee、ImagePipeline)時用到了很多的設計模式,如果不太熟習這些設計模式,可能理解起來會比較費勁。更加關鍵的是,初始化對應的組件用到了大量的參數,每一個參數背后又會牽扯到很多知識點,后續博文中,我們再來逐一分析。

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 欧美一级在线观看视频 | 97av在线视频 | 91精品综合久久久久3d动漫 | 欧美三级小视频 | 色综合亚洲精品激情狠狠 | 亚洲精品欧美综合 | 午夜影院在线观看 | 亚洲国产欧美目韩成人综合 | 伊人久久大香线蕉综合7 | 日本特黄视频 | 亚洲国产成人久久精品图片 | 亚洲黄色网址大全 | 国产精品免费福利 | 亚洲综合小说久久另类区 | yellow中文字幕官网是 | 亚洲视频自拍偷拍 | 国内精品久久久久影院嫩草 | 东方aⅴ免费观看久久av | 亚洲精品一二三区 | 老司机午夜在线视频免费 | 另类五月 | 琪琪理论影院2018中文版 | 特级毛片女人18毛片 | 精品国产福利片在线观看 | 亚洲美女高清aⅴ视频免费 亚洲美女激情视频 | 亚洲自拍偷拍视频 | 亚洲国产精品一区二区三区久久 | 日本不卡在线观看免费v | 亚洲片在线观看 | 99一级毛片 | 欧美在线一级片 | 亚洲欧美综合另类图片小说区 | 欧美一级视频在线观看欧美 | 精品国产一区二区三区19 | 亚洲精品第1页 | 亚洲精品第一第二区 | 在线观看的免费视频网站 | 国产成人精品一区二三区2022 | 欧美一区二区三区视频在线观看 | 亚洲精品在线免费看 | www黄网站|