Glide4.10 源码

本文详细介绍了Glide 4.10的源码,包括基本使用、Glide的成员变量如`Glide.with`和`RequestManagerRetriever`,以及Glide如何跟踪Activity或Fragment的生命周期。同时,深入讲解了`RequestManager`、`RequestBuilder`、`Target`和`Request`的概念。在请求执行过程中,`Engine`、`EngineJob`和`DecodeJob`在图片加载中的作用也得到了阐述,特别是Request的开始并不会立即创建网络请求,而是在获取到目标尺寸后进行。
摘要由CSDN通过智能技术生成
基本使用:

依赖:

   implementation 'com.github.bumptech.glide:glide:4.10.0'
   annotationProcessor 'com.github.bumptech.glide:compiler:4.10.0'

使用:

	//Glide3中的许多配置选项转移到了RequestOptions中
	RequestOptions options = new RequestOptions();
    options.placeholder(R.drawable.ic_launcher_background)
         .diskCacheStrategy(DiskCacheStrategy.NONE)
         .skipMemoryCache(false)
         .override(Target.SIZE_ORIGINAL);
         
    //Glide调用链中的类型转化:				
    Glide							//Glide
         .with(this)				//RequsetManager
         .load(url)					//RequestBuilder<Drawable>
         .apply(options)			//RequestBuilder<Drawable>
         .into(target);				//Target<Drawable>
Glide的成员变量:
public class Glide implements ComponentCallbacks2 {
   
	private static volatile Glide glide;
  	private static volatile boolean isInitializing;
	//远程请求图片的核心类,同时也管理一些缓存
  	private final Engine engine;
  	private final BitmapPool bitmapPool;
 	private final MemoryCache memoryCache;
  	private final GlideContext glideContext;
  	private final Registry registry;
  	private final ArrayPool arrayPool;
  	//专门用来产生RequestManager,可以理解为RequestManagerFactory
  	private final RequestManagerRetriever requestManagerRetriever;			
  	private final ConnectivityMonitorFactory connectivityMonitorFactory;
  	private final List<RequestManager> managers = new ArrayList<>();
  	private final RequestOptionsFactory defaultRequestOptionsFactory;
  	private MemoryCategory memoryCategory = MemoryCategory.NORMAL;
}
Glide.with
public class Glide implements ComponentCallbacks2 {
   
	//requestManagerRetriever一般都用GlideBuilder里默认生成的
	private final RequestManagerRetriever requestManagerRetriever;
	
	public static RequestManager with(Context context){
   
		//Glide把生成RequestManager的任务都交给了RequestManagerRetriever:
		return getRetriever(context).get(context);
	}
	//其他with方法都是类似的写法,略
	public static RequestManager with(Activity activity);
	public static RequestManager with(FragmentActivity activity);
	public static RequestManager with(Fragment fragment);
	public static RequestManager with(android.app.Fragment fragment);
	public static RequestManager with(View view);

	private static RequestManagerRetriever getRetriever(Context context) {
   
		return Glide.get(context).getRequestManagerRetriever();
	}
}
RequestManagerRetriever
public class RequestManagerRetriever implements Handler.Callback {
   
	//全局的RequestManager,如果with(Context)的参数传了Application就会返回这个RequestManager单例
	private volatile RequestManager applicationManager;
	
	//1.获取全局的RequestManager单例;
	private RequestManager getApplicationManager(Context context) {
   
		return applicationManager		//双重检查锁单例,略
	}
	
	//2.获取Fragment和FragmentActivity的RequestManager 
	private RequestManager supportFragmentGet(Context context,
	 					FragmentManager fm,Fragment parentHint,boolean isParentVisible);
	 					
	//3.获取android.app.Fragment和Activity的RequestManager  					
	private RequestManager fragmentGet(Context context,android.app.FragmentManager fm,
						android.app.Fragment parentHint,boolean isParentVisible);
						
	//以下是伪代码:根据参数类型不同调用上面三个方法生成RequestManager 
	public RequestManager get(xxx) {
   
		//在子线程或是Application返回全局的RequestManager单例
		if (Util.isOnBackgroundThread() || xxx instanceof Application) {
   
			return getApplicationContext());
		} 
		//原生android.appfragment调用fragmentGet
		else if(xxx instanceof android.app.Fragment fragment){
   
			android.app.FragmentManager fm = fragment.getChildFragmentManager();
			return fragmentGet(fragment.getActivity(), fm, fragment, fragment.isVisible());
		} 
		//原生Activity调用fragmentGet
		else if(xxx instanceof Activity){
   
			android.app.FragmentManager fm = activity.getFragmentManager();
			
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值