在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 documentationHeaderedLoader
和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 */ }
}
您应该能够保持逻辑以处理public void registerComponents(Context context, Glide glide, Registry registry)
类中的http标头。我已经使用这种方法为glide 4.0添加自定义标头滑行请求。
试试这个
@Override
public void registerComponents(Context context, Glide glide, Registry registry) {
registry.append(String.class, InputStream.class, new HeaderedLoader.Factory());
}