2017-08-20 26 views
1

在滑翔3.x中,我們可以添加這樣註冊下列字符串模式裝載機:如何Authorization頭添加到所有滑翔4.x的要求

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

} 

但它不是從文檔清楚我們如何才能做到這一點爲最新版本。

任何提示?謝謝!

回答

1

試試這個

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

我面臨着同樣的問題,因爲你。 這是我如何修復它。

  1. GlideService需要擴展AppGlideModule(如果你正在編寫一個應用程序代碼)。有關更多細節見glide documentation

  2. 正如你現在正在使用滑行4.x版,您HeaderedLoader類現在已經重寫的BaseGlideUrlLoader<String>兩個默認的構造函數,這些都是protected HeaderedLoader(ModelLoader<GlideUrl, InputStream> concreteLoader)protected HeaderedLoader(ModelLoader<GlideUrl, InputStream> concreteLoader, @Nullable ModelCache<String, GlideUrl> modelCache)

  3. 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 */ } 
    } 
    
  4. 然後,您將覆蓋滑翔模塊超類的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()); 
    } 
    

你應該能夠保持你的邏輯來處理HTTP頭在HeaderedLoader類中。 我已經使用這種方法來添加自定義標題與滑翔4.0的滑翔請求。

+0

使用prepend()。 prepend()將確保您的ModelLoader或ResourceDecoder在所有其他先前註冊的組件之前被調用,並且可以先運行。 – chad