在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请求中。

08-06 07:39