2017-08-20 2 views
1

3.x Glide nous pourrions ajouter enregistrer un modèle de chaîne chargeur comme suit:Comment ajouter en-tête d'autorisation à toute demande 4.x Glide

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() { } 
     } 
    } 

} 

Mais ce n'est pas clairement des documents que nous pouvons y parvenir pour la dernière version.

Des conseils? Merci!

Répondre

1

essayer cette

import com.bumptech.glide.load.Options; 
import com.bumptech.glide.load.model.GlideUrl; 
import com.bumptech.glide.load.model.ModelLoader; 
import com.bumptech.glide.load.model.ModelLoaderFactory; 
import com.bumptech.glide.load.model.MultiModelLoaderFactory; 
import java.io.InputStream; 
import okhttp3.Call; 
import okhttp3.OkHttpClient; 

/** 
* A simple model loader for fetching media over http/https using OkHttp. 
*/ 
public class OkHttpUrlLoader implements ModelLoader<GlideUrl, InputStream> { 

    private final Call.Factory client; 

    public OkHttpUrlLoader(Call.Factory client) { 
    this.client = client; 
    } 

    @Override 
    public boolean handles(GlideUrl url) { 
    return true; 
    } 

    @Override 
    public LoadData<InputStream> buildLoadData(GlideUrl model, int width, int height, 
     Options options) { 
    return new LoadData<>(model, new OkHttpStreamFetcher(client, model)); 
    } 

    /** 
    * The default factory for {@link OkHttpUrlLoader}s. 
    */ 
    public static class Factory implements ModelLoaderFactory<GlideUrl, InputStream> { 
    private static volatile Call.Factory internalClient; 
    private Call.Factory client; 

    private static Call.Factory getInternalClient() { 
     if (internalClient == null) { 
     synchronized (Factory.class) { 
      if (internalClient == null) { 
      internalClient = new OkHttpClient(); 
      } 
     } 
     } 
     return internalClient; 
    } 

    /** 
    * Constructor for a new Factory that runs requests using a static singleton client. 
    */ 
    public Factory() { 
     this(getInternalClient()); 
    } 

    /** 
    * Constructor for a new Factory that runs requests using given client. 
    * 
    * @param client this is typically an instance of {@code OkHttpClient}. 
    */ 
    public Factory(Call.Factory client) { 
     this.client = client; 
    } 

    @Override 
    public ModelLoader<GlideUrl, InputStream> build(MultiModelLoaderFactory multiFactory) { 
     return new OkHttpUrlLoader(client); 
    } 

    @Override 
    public void teardown() { 
     // Do nothing, this instance doesn't own the client. 
    } 
    } 
}` 
1

je fais face à la même question que vous. Voici comment je l'ai réparé.

  1. Vos GlideService besoins à étend AppGlideModule (si vous écrivez du code pour une application). Pour plus de détails sur ce sujet, voir glide documentation

  2. Comme vous utilisez actuellement 4.x glide, votre classe HeaderedLoader a overriden les deux constructeur par défaut de BaseGlideUrlLoader<String>, ceux-ci sont protected HeaderedLoader(ModelLoader<GlideUrl, InputStream> concreteLoader) et protected HeaderedLoader(ModelLoader<GlideUrl, InputStream> concreteLoader, @Nullable ModelCache<String, GlideUrl> modelCache).

  3. Créez une fabrique pour la classe HeaderedLoader. Cela devrait ressembler à

    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 */ } 
    } 
    
  4. Vous serez alors remplacer la méthode public void registerComponents(Context context, Glide glide, Registry registry) du module de descente de super classe avec les éléments suivants

    @Override 
    public void registerComponents(Context context, Glide glide, Registry registry) { 
        registry.append(String.class, InputStream.class, new HeaderedLoader.Factory()); 
    } 
    

Vous devriez être en mesure de garder votre logique pour la manipulation en-tête http à l'intérieur de la classe HeaderedLoader. J'ai utilisé cette approche pour ajouter l'en-tête personnalisé à la demande de glissement avec glide 4.0.

+0

en utilisant prepend(). prepend() s'assurera que votre ModelLoader ou ResourceDecoder est appelé avant tous les autres composants précédemment enregistrés et peut être exécuté en premier. – chad