A fast and efficient open source media management and image loading framework for Android that wraps media decoding, memory and disk caching, and resource pooling into a simple and easy to use interface.
—
Global configuration and extension system for customizing Glide behavior, including custom loaders, decoders, cache implementations, and module registration.
Base interfaces for creating configuration modules that customize Glide's behavior.
/**
* Legacy module interface for global Glide configuration
*/
public interface GlideModule {
/**
* Apply global configuration options
* @param context Application context
* @param builder Glide builder for configuration
*/
void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder);
/**
* Register custom components
* @param context Application context
* @param glide Glide instance
* @param registry Component registry
*/
void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry);
}
/**
* Application-level module for configuration
*/
public abstract class AppGlideModule extends GeneratedAppGlideModule {
/**
* Apply global configuration options
* @param context Application context
* @param builder Glide builder for configuration
*/
public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) {
// Override to customize configuration
}
/**
* Register custom components
* @param context Application context
* @param glide Glide instance
* @param registry Component registry
*/
public void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) {
// Override to register custom components
}
/**
* Control manifest parsing
* @return true to enable parsing AndroidManifest.xml for modules
*/
public boolean isManifestParsingEnabled() {
return true;
}
/**
* Get excluded module classes
* @return Set of module classes to exclude
*/
@NonNull
public Set<Class<?>> getExcludedModuleClasses() {
return Collections.emptySet();
}
}
/**
* Library-level module for component registration
*/
public abstract class LibraryGlideModule implements RegistersComponents {
/**
* Register custom components
* @param context Application context
* @param glide Glide instance
* @param registry Component registry
*/
@Override
public abstract void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry);
}Usage Examples:
// AppGlideModule implementation
@GlideModule
public final class MyAppGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
// Custom memory cache
int memoryCacheSizeBytes = 1024 * 1024 * 20; // 20mb
builder.setMemoryCache(new LruResourceCache(memoryCacheSizeBytes));
// Custom disk cache
builder.setDiskCache(new InternalCacheDiskCacheFactory(context, 100 * 1024 * 1024));
// Request options
RequestOptions requestOptions = new RequestOptions()
.format(DecodeFormat.PREFER_RGB_565)
.disallowHardwareConfig();
builder.setDefaultRequestOptions(requestOptions);
}
@Override
public void registerComponents(Context context, Glide glide, Registry registry) {
// Custom model loader
registry.append(MyCustomModel.class, InputStream.class, new MyModelLoaderFactory());
// Custom decoder
registry.register(InputStream.class, MyResource.class, new MyResourceDecoder());
}
}
// LibraryGlideModule implementation
public class MyLibraryGlideModule extends LibraryGlideModule {
@Override
public void registerComponents(Context context, Glide glide, Registry registry) {
// Register library-specific components
registry.prepend(MyLibraryModel.class, InputStream.class, new MyLibraryModelLoader.Factory());
}
}Configuration builder for customizing Glide's global behavior and components.
/**
* Builder for configuring Glide instances
*/
public final class GlideBuilder {
/**
* Set custom bitmap pool
* @param bitmapPool Custom bitmap pool implementation
* @return GlideBuilder for chaining
*/
@NonNull public GlideBuilder setBitmapPool(@Nullable BitmapPool bitmapPool);
/**
* Set custom array pool
* @param arrayPool Custom array pool implementation
* @return GlideBuilder for chaining
*/
@NonNull public GlideBuilder setArrayPool(@Nullable ArrayPool arrayPool);
/**
* Set custom memory cache
* @param memoryCache Custom memory cache implementation
* @return GlideBuilder for chaining
*/
@NonNull public GlideBuilder setMemoryCache(@Nullable MemoryCache memoryCache);
/**
* Set custom disk cache factory
* @param diskCacheFactory Custom disk cache factory
* @return GlideBuilder for chaining
*/
@NonNull public GlideBuilder setDiskCache(@Nullable DiskCache.Factory diskCacheFactory);
/**
* Set custom execution engine
* @param engine Custom engine implementation
* @return GlideBuilder for chaining
*/
@NonNull public GlideBuilder setEngine(@Nullable Engine engine);
/**
* Set default request options
* @param requestOptions Default options for all requests
* @return GlideBuilder for chaining
*/
@NonNull public GlideBuilder setDefaultRequestOptions(@Nullable RequestOptions requestOptions);
/**
* Set default transition options for specific resource type
* @param clazz Resource class
* @param options Transition options
* @return GlideBuilder for chaining
*/
@NonNull public <T> GlideBuilder setDefaultTransitionOptions(@NonNull Class<T> clazz, @Nullable TransitionOptions<?, T> options);
/**
* Set logging level
* @param logLevel Android log level (Log.VERBOSE, Log.DEBUG, etc.)
* @return GlideBuilder for chaining
*/
@NonNull public GlideBuilder setLogLevel(int logLevel);
/**
* Set whether to log request origins for debugging
* @param isEnabled true to enable request origin logging
* @return GlideBuilder for chaining
*/
@NonNull public GlideBuilder setLogRequestOrigins(boolean isEnabled);
/**
* Set image header parser registry
* @param imageHeaderParsers Custom header parsers
* @return GlideBuilder for chaining
*/
@NonNull public GlideBuilder setImageDecoderEnabledForBitmaps(boolean isEnabled);
}Configuration Examples:
@Override
public void applyOptions(Context context, GlideBuilder builder) {
// Memory configuration
int memoryCacheSizeBytes = (int) (Runtime.getRuntime().maxMemory() / 8);
builder.setMemoryCache(new LruResourceCache(memoryCacheSizeBytes));
// Disk cache configuration
long diskCacheSizeBytes = 1024 * 1024 * 100; // 100 MB
builder.setDiskCache(new InternalCacheDiskCacheFactory(context, diskCacheSizeBytes));
// Bitmap pool configuration
int bitmapPoolSizeBytes = memoryCacheSizeBytes / 2;
builder.setBitmapPool(new LruBitmapPool(bitmapPoolSizeBytes));
// Default request options
RequestOptions requestOptions = new RequestOptions()
.format(DecodeFormat.PREFER_RGB_565)
.timeout(30000);
builder.setDefaultRequestOptions(requestOptions);
// Debugging
builder.setLogLevel(Log.DEBUG)
.setLogRequestOrigins(true);
}Component registry for registering custom loaders, decoders, encoders, and transformations.
/**
* Registry for Glide components
*/
public class Registry {
/**
* Append model loader factory
* @param modelClass Model class
* @param dataClass Data class
* @param factory Loader factory
* @return Registry for chaining
*/
@NonNull public <Model, Data> Registry append(@NonNull Class<Model> modelClass, @NonNull Class<Data> dataClass, @NonNull ModelLoaderFactory<Model, Data> factory);
/**
* Prepend model loader factory
* @param modelClass Model class
* @param dataClass Data class
* @param factory Loader factory
* @return Registry for chaining
*/
@NonNull public <Model, Data> Registry prepend(@NonNull Class<Model> modelClass, @NonNull Class<Data> dataClass, @NonNull ModelLoaderFactory<Model, Data> factory);
/**
* Replace model loader factory
* @param modelClass Model class
* @param dataClass Data class
* @param factory Loader factory
* @return Registry for chaining
*/
@NonNull public <Model, Data> Registry replace(@NonNull Class<Model> modelClass, @NonNull Class<Data> dataClass, @NonNull ModelLoaderFactory<Model, Data> factory);
/**
* Register resource decoder
* @param dataClass Input data class
* @param resourceClass Output resource class
* @param decoder Resource decoder
* @return Registry for chaining
*/
@NonNull public <Data, TResource> Registry register(@NonNull Class<Data> dataClass, @NonNull Class<TResource> resourceClass, @NonNull ResourceDecoder<Data, TResource> decoder);
/**
* Register resource encoder
* @param resourceClass Resource class
* @param encoder Resource encoder
* @return Registry for chaining
*/
@NonNull public <TResource> Registry register(@NonNull Class<TResource> resourceClass, @NonNull ResourceEncoder<TResource> encoder);
/**
* Register transformation
* @param resourceClass Resource class
* @param transformation Transformation implementation
* @return Registry for chaining
*/
@NonNull public <TResource> Registry register(@NonNull Class<TResource> resourceClass, @NonNull Transformation<TResource> transformation);
}Registry Examples:
@Override
public void registerComponents(Context context, Glide glide, Registry registry) {
// Custom model loader for special URL format
registry.append(CustomUrl.class, InputStream.class, new CustomUrlLoader.Factory());
// Custom decoder for special image format
registry.register(InputStream.class, SpecialImage.class, new SpecialImageDecoder());
// Custom encoder for special format
registry.register(SpecialImage.class, new SpecialImageEncoder());
// Custom transformation
registry.register(Bitmap.class, new BlurTransformation());
// Replace existing loader
registry.replace(GlideUrl.class, InputStream.class, new MyHttpUrlLoader.Factory());
}Interfaces for creating custom loaders, decoders, and encoders.
/**
* Factory for creating model loaders
*/
public interface ModelLoaderFactory<T, Y> {
/**
* Build model loader instance
* @param multiFactory Multi model loader factory
* @return Model loader instance
*/
@NonNull ModelLoader<T, Y> build(@NonNull MultiModelLoaderFactory multiFactory);
/**
* Cleanup resources
*/
void teardown();
}
/**
* Decoder for converting data to resources
*/
public interface ResourceDecoder<T, Z> {
/**
* Check if decoder can handle the data
* @param source Data source
* @param options Request options
* @return true if can decode
*/
boolean handles(@NonNull T source, @NonNull Options options) throws IOException;
/**
* Decode data to resource
* @param source Data source
* @param width Target width
* @param height Target height
* @param options Request options
* @return Decoded resource
*/
@Nullable Resource<Z> decode(@NonNull T source, int width, int height, @NonNull Options options) throws IOException;
}
/**
* Encoder for persisting resources to disk
*/
public interface ResourceEncoder<T> {
/**
* Encode resource to file
* @param data Resource to encode
* @param file Output file
* @param options Request options
* @return true if successful
*/
boolean encode(@NonNull Resource<T> data, @NonNull File file, @NonNull Options options);
/**
* Get encoding strategy
* @param options Request options
* @return Encoding strategy
*/
@NonNull EncodeStrategy getEncodeStrategy(@NonNull Options options);
}// Component interfaces
public interface RegistersComponents {
void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry);
}
// Encoding strategy
public enum EncodeStrategy {
NONE, SOURCE, TRANSFORMED
}
// Generated module base class
public abstract class GeneratedAppGlideModule {
// Generated by annotation processor
}Install with Tessl CLI
npx tessl i tessl/maven-com-github-bumptech-glide--glide