前言:加载图片的框架有很多,从早期的XUtils、Universal Image Loader,到后来的Volley,以及现在如日中天的Glide和Picasso,以及Facebook的Fresco。XUtils、Universal Image Loader和Volley都用过,上一个项目用的Volley,后来项目中要加载GIF图片,于是嵌入了Glide框架的3.7版本。目前在行项目中,使用Glide的4.3.1版本,然后瞬间懵了,因为4.3.1版本中,除了widt、load、into方法,再也没有其他的方法了。本文就是为了让你在使用Glide4.3.1版本时也能有fallback、error、override、plaeholder等方法。
一、导入Glide相关架包
导入架包,就涉及到build.gradle文件的配置,在AS中,有两个build.gradle文件,一个在项目目录下,一个在app目录下。
首先、在项目的build.gradle文件中添加mavenCentral()方法,主要是方便项目引用mavenCentral中的开源项目;
其次、在app目录下的build.gradle文件下引入架包
二、创建相关类MyAppGlideModule(继承AppGlideModule)和MyBaseGlideUrlLoader(继承),名字自己随便起,值得注意的是,MyAppGlideModule类需要使用注释@GlideModule
@GlideModule public final class MyAppGlideModule extends AppGlideModule { @Override public void applyOptions(Context context, GlideBuilder builder) { // super.applyOptions(context, builder); // 重新设置内存限制 builder.setMemoryCache(new LruResourceCache(10 * 1024 * 1024)); } @Override public void registerComponents(Context context, Glide glide, Registry registry) { // super.registerComponents(context, glide, registry); registry.append(String.class, InputStream.class, new MyBaseGlideUrlLoader.MyFactory()); } @Override public boolean isManifestParsingEnabled() { // return super.isManifestParsingEnabled(); return false; } }
public class MyBaseGlideUrlLoader extends BaseGlideUrlLoader<String> { private static final ModelCache<String, GlideUrl> mModelCache = new ModelCache<>(150); private MyBaseGlideUrlLoader(ModelLoader<GlideUrl, InputStream> modelLoader, ModelCache<String, GlideUrl> modelCache) { super(modelLoader, modelCache); } @Override // __w-200-400-800__ protected String getUrl(String s, int width, int height, Options options) { Matcher matcher = Pattern.compile("__w-((?:-?\\d+)+)__").matcher(s); int bestBucket = 0; if (matcher.find()) { String[] found = matcher.group(1).split("-"); for (String bucket : found) { bestBucket = Integer.parseInt(bucket); if (bestBucket >= width) break; } if (bestBucket > 0) s = matcher.replaceFirst("w" + bestBucket); } return s; } @Override public boolean handles(String s) { return true; } /** * 工厂 */ public static class MyFactory implements ModelLoaderFactory<String, InputStream> { @Override public ModelLoader<String, InputStream> build(MultiModelLoaderFactory multiFactory) { return new MyBaseGlideUrlLoader(multiFactory.build(GlideUrl.class, InputStream.class), mModelCache); } @Override public void teardown() {} } }
总结:只需要2步,编译项目后,会在build目录下出现一个GlideApp的类,用这个类就可以轻松实现3.7版本中的方法了