在Glide 3.x中,我们可以添加注册String模型加载器,如下所示:
public class GlideService /* implements GlideModule*/ {
@Override
public void registerComponents(Context context, Glide glide) {
glide.register(String.class, InputStream.class, new HeaderedLoader.Factory());
}
private static class HeaderedLoader extends BaseGlideUrlLoader<String> {
public HeaderedLoader(Context context) {
super(context);
}
@Override
protected String getUrl(String model, int width, int height) {
return model;
}
@Override
protected Headers getHeaders(String model, int width, int height) {
LazyHeaders.Builder headersBuilder = new LazyHeaders.Builder();
if (BuildConfig.FLAVOR.equals("staging")) {
String auth = "username:password";
String base64 = Base64.encodeToString(auth.getBytes(), Base64.NO_WRAP);
headersBuilder.addHeader("Authorization", "Basic " + base64);
}
return headersBuilder.build();
}
public static class Factory implements ModelLoaderFactory<String, InputStream> {
@Override
public StreamModelLoader<String> build(Context context, GenericLoaderFactory factories) {
return new HeaderedLoader(context);
}
@Override
public void teardown() { }
}
}
}
但是从文档中尚不清楚我们如何才能在最新版本中做到这一点。
最佳答案
我和你面临同样的问题。
这是我固定的方式。
您的GlideService
需要扩展AppGlideModule
(如果您正在为应用程序编写代码)。有关此的更多详细信息,请参见glide documentation
当您现在使用glide 4.x时,您的类HeaderedLoader
现在已经覆盖了BaseGlideUrlLoader<String>
的两个默认构造函数,分别是protected HeaderedLoader(ModelLoader<GlideUrl, InputStream> concreteLoader)
和protected HeaderedLoader(ModelLoader<GlideUrl, InputStream> concreteLoader, @Nullable ModelCache<String, GlideUrl> modelCache)
。
为HeaderedLoader
类创建一个工厂。
看起来应该像
static class Factory implements ModelLoaderFactory<String, InputStream> {
@Override
public ModelLoader<String, InputStream> build(MultiModelLoaderFactory multiFactory) {
ModelLoader<GlideUrl, InputStream> loader = multiFactory.build(GlideUrl.class, InputStream.class);
return new HeaderedLoader(loader);
}
@Override public void teardown() { /* nothing to free */ }
}
然后,您将使用以下代码覆盖glide模块超类的
public void registerComponents(Context context, Glide glide, Registry registry)
方法@Override
public void registerComponents(Context context, Glide glide, Registry registry) {
registry.append(String.class, InputStream.class, new HeaderedLoader.Factory());
}
您应该能够在
HeaderedLoader
类中保留用于处理http标头的逻辑。我已经使用这种方法将自定义标头添加到使用glide 4.0的glide请求中。