Glide GlideModule个性化Glide
Glide可以通过GlideModule去个性化它的一些属性。
我们写SDK的时候,通常是在sdk初始化的时候(Application.onCreate的时候)传参数进去完成;而Glide与众不同的是,通过meta-data指定一个类,操作builder从而达到目的。
这样做的好处是,你不知道Glide对象在何时需要初始化,但是只要初始化的时候,就一定会通过配置好的GlideModule对象去个性化Glide
还有,Glide的构造采用builder模式。
来看看Glide的代码
public static Glide get(Context context) {
if (glide == null) {
synchronized (Glide.class) {
if (glide == null) {
Context applicationContext = context.getApplicationContext();
//创建manifestParser去解析meta-data
List<GlideModule> modules =
new ManifestParser(applicationContext).parse();
//创建builder
GlideBuilder builder = new GlideBuilder(applicationContext);
for (GlideModule module : modules) {
//GlideModule去个性化builder
module.applyOptions(applicationContext, builder);
}
//创建出想要的glide
glide = builder.createGlide();
for (GlideModule module : modules) {
//注册一些想要的组件
//例如:glide.register(Model.class, Data.class, new MyModelLoader());
module.registerComponents(applicationContext, glide);
}
}
}
}
return glide;
}
public List<GlideModule> parse() {
List<GlideModule> modules = new ArrayList<GlideModule>();
try {
ApplicationInfo appInfo = context.getPackageManager().getApplicationInfo(
context.getPackageName(), PackageManager.GET_META_DATA);
if (appInfo.metaData != null) {
//遍历所有的meta-data,然后找出value=GlideModule的className
for (String key : appInfo.metaData.keySet()) {
if (GLIDE_MODULE_VALUE.equals(appInfo.metaData.get(key))) {
modules.add(parseModule(key));
}
}
}
//...ignore code
return modules;
}
private static GlideModule parseModule(String className) {
Class<?> clazz;
try {
clazz = Class.forName(className);
//...ignore code
Object module;
//通过反射实例化对象
try {
module = clazz.newInstance();
//...ignore code
return (GlideModule) module;
}
另外,Glide还可以
从Glide的实例化之前和之后都可以注入一些个性化的东西,实例化前可以个性化bitmapPool,MemoryCache等等;实例化后可以通过register注册loader。 这个思想值得学习。