diff options
author | Sam Judd <judds@google.com> | 2014-10-11 21:12:54 -0700 |
---|---|---|
committer | Sam Judd <judds@google.com> | 2014-10-14 07:21:13 -0700 |
commit | b01082225896132431da0ee9a85028d610ae4abf (patch) | |
tree | 6c2c45e0ebd207f11343a7abc11fcd2aed949197 /library/src/main/java/com | |
parent | 4c0c22e7f5fa76d9f44d79b06866f1d09f305d82 (diff) | |
download | glide-b01082225896132431da0ee9a85028d610ae4abf.tar.gz |
Allow request builder re-use.
Diffstat (limited to 'library/src/main/java/com')
9 files changed, 95 insertions, 45 deletions
diff --git a/library/src/main/java/com/bumptech/glide/BitmapRequestBuilder.java b/library/src/main/java/com/bumptech/glide/BitmapRequestBuilder.java index b15819cf..d48d0606 100644 --- a/library/src/main/java/com/bumptech/glide/BitmapRequestBuilder.java +++ b/library/src/main/java/com/bumptech/glide/BitmapRequestBuilder.java @@ -455,6 +455,12 @@ public class BitmapRequestBuilder<ModelType, TranscodeType> return this; } + @Override + public BitmapRequestBuilder<ModelType, TranscodeType> load(ModelType model) { + super.load(model); + return this; + } + /** * {@inheritDoc} * diff --git a/library/src/main/java/com/bumptech/glide/BitmapTypeRequest.java b/library/src/main/java/com/bumptech/glide/BitmapTypeRequest.java index 2812e5d6..485b10fd 100644 --- a/library/src/main/java/com/bumptech/glide/BitmapTypeRequest.java +++ b/library/src/main/java/com/bumptech/glide/BitmapTypeRequest.java @@ -20,7 +20,6 @@ import java.io.InputStream; * @param <ModelType> The type of model to load the {@link Bitmap} or transcoded class from. */ public class BitmapTypeRequest<ModelType> extends BitmapRequestBuilder<ModelType, Bitmap> { - private final ModelType model; private final ModelLoader<ModelType, InputStream> streamModelLoader; private final ModelLoader<ModelType, ParcelFileDescriptor> fileDescriptorModelLoader; private final Glide glide; @@ -53,7 +52,6 @@ public class BitmapTypeRequest<ModelType> extends BitmapRequestBuilder<ModelType Bitmap.class, other); this.streamModelLoader = streamModelLoader; this.fileDescriptorModelLoader = fileDescriptorModelLoader; - this.model = other.model; this.glide = other.glide; this.optionsApplier = optionsApplier; } @@ -68,7 +66,7 @@ public class BitmapTypeRequest<ModelType> extends BitmapRequestBuilder<ModelType */ public <R> BitmapRequestBuilder<ModelType, R> transcode(ResourceTranscoder<Bitmap, R> transcoder, Class<R> transcodeClass) { - return optionsApplier.apply(model, new BitmapRequestBuilder<ModelType, R>( + return optionsApplier.apply(new BitmapRequestBuilder<ModelType, R>( buildProvider(glide, streamModelLoader, fileDescriptorModelLoader, transcodeClass, transcoder), transcodeClass, this)); } diff --git a/library/src/main/java/com/bumptech/glide/DrawableRequestBuilder.java b/library/src/main/java/com/bumptech/glide/DrawableRequestBuilder.java index 187aebd9..0a7b9bce 100644 --- a/library/src/main/java/com/bumptech/glide/DrawableRequestBuilder.java +++ b/library/src/main/java/com/bumptech/glide/DrawableRequestBuilder.java @@ -41,10 +41,10 @@ public class DrawableRequestBuilder<ModelType> extends GenericRequestBuilder<ModelType, ImageVideoWrapper, GifBitmapWrapper, GlideDrawable> implements BitmapOptions, DrawableOptions { - DrawableRequestBuilder(Context context, ModelType model, + DrawableRequestBuilder(Context context, Class<ModelType> modelClass, LoadProvider<ModelType, ImageVideoWrapper, GifBitmapWrapper, GlideDrawable> loadProvider, Glide glide, RequestTracker requestTracker, Lifecycle lifecycle) { - super(context, model, loadProvider, GlideDrawable.class, glide, requestTracker, lifecycle); + super(context, modelClass, loadProvider, GlideDrawable.class, glide, requestTracker, lifecycle); // Default to animating. crossFade(); } @@ -406,6 +406,12 @@ public class DrawableRequestBuilder<ModelType> return this; } + @Override + public DrawableRequestBuilder<ModelType> load(ModelType model) { + super.load(model); + return this; + } + /** * {@inheritDoc} * diff --git a/library/src/main/java/com/bumptech/glide/DrawableTypeRequest.java b/library/src/main/java/com/bumptech/glide/DrawableTypeRequest.java index 21c1139f..84d3a273 100644 --- a/library/src/main/java/com/bumptech/glide/DrawableTypeRequest.java +++ b/library/src/main/java/com/bumptech/glide/DrawableTypeRequest.java @@ -50,10 +50,10 @@ public class DrawableTypeRequest<ModelType> extends DrawableRequestBuilder<Model return new FixedLoadProvider<A, ImageVideoWrapper, Z, R>(modelLoader, transcoder, dataLoadProvider); } - DrawableTypeRequest(ModelType model, ModelLoader<ModelType, InputStream> streamModelLoader, + DrawableTypeRequest(Class<ModelType> modelClass, ModelLoader<ModelType, InputStream> streamModelLoader, ModelLoader<ModelType, ParcelFileDescriptor> fileDescriptorModelLoader, Context context, Glide glide, RequestTracker requestTracker, Lifecycle lifecycle, RequestManager.OptionsApplier optionsApplier) { - super(context, model, + super(context, modelClass, buildProvider(glide, streamModelLoader, fileDescriptorModelLoader, GifBitmapWrapper.class, GlideDrawable.class, null), glide, requestTracker, lifecycle); @@ -68,7 +68,7 @@ public class DrawableTypeRequest<ModelType> extends DrawableRequestBuilder<Model * @return A new request builder for loading a {@link android.graphics.Bitmap} */ public BitmapTypeRequest<ModelType> asBitmap() { - return optionsApplier.apply(model, new BitmapTypeRequest<ModelType>(this, streamModelLoader, + return optionsApplier.apply(new BitmapTypeRequest<ModelType>(this, streamModelLoader, fileDescriptorModelLoader, optionsApplier)); } @@ -85,7 +85,7 @@ public class DrawableTypeRequest<ModelType> extends DrawableRequestBuilder<Model * @return A new request builder for loading a {@link com.bumptech.glide.load.resource.gif.GifDrawable}. */ public GifTypeRequest<ModelType> asGif() { - return optionsApplier.apply(model, new GifTypeRequest<ModelType>(this, streamModelLoader, optionsApplier)); + return optionsApplier.apply(new GifTypeRequest<ModelType>(this, streamModelLoader, optionsApplier)); } /** @@ -103,7 +103,7 @@ public class DrawableTypeRequest<ModelType> extends DrawableRequestBuilder<Model } private GenericTranscodeRequest<ModelType, InputStream, File> getDownloadOnlyRequest() { - return optionsApplier.apply(model, new GenericTranscodeRequest<ModelType, InputStream, File>(File.class, this, + return optionsApplier.apply(new GenericTranscodeRequest<ModelType, InputStream, File>(File.class, this, streamModelLoader, InputStream.class, File.class, optionsApplier)); } } diff --git a/library/src/main/java/com/bumptech/glide/GenericRequestBuilder.java b/library/src/main/java/com/bumptech/glide/GenericRequestBuilder.java index 698d58e0..12da07eb 100644 --- a/library/src/main/java/com/bumptech/glide/GenericRequestBuilder.java +++ b/library/src/main/java/com/bumptech/glide/GenericRequestBuilder.java @@ -38,11 +38,6 @@ import java.io.File; /** * A generic class that can handle setting options and staring loads for generic resource types. * - * <p> - * Warning - It is <em>not</em> safe to use this builder after calling <code>into()</code>, it may be pooled and - * reused. - * </p> - * * @param <ModelType> The type of model representing the resource. * @param <DataType> The data type that the resource {@link com.bumptech.glide.load.model.ModelLoader} will provide that * can be decoded by the {@link com.bumptech.glide.load.ResourceDecoder}. @@ -50,9 +45,9 @@ import java.io.File; * @param <TranscodeType> The type of resource the decoded resource will be transcoded to. */ public class GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> { + protected final Class<ModelType> modelClass; protected final Context context; protected final Glide glide; - protected final ModelType model; protected final Class<TranscodeType> transcodeClass; protected final RequestTracker requestTracker; protected final Lifecycle lifecycle; @@ -60,6 +55,10 @@ public class GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeT private Key signature = EmptySignature.obtain(); + private ModelType model; + // model may occasionally be null, so to enforce that load() was called, set a boolean rather than relying on model + // not to be null. + private boolean isModelSet; private int placeholderId; private int errorId; private RequestListener<ModelType, TranscodeType> requestListener; @@ -79,18 +78,20 @@ public class GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeT GenericRequestBuilder(LoadProvider<ModelType, DataType, ResourceType, TranscodeType> loadProvider, Class<TranscodeType> transcodeClass, GenericRequestBuilder<ModelType, ?, ?, ?> other) { - this(other.context, other.model, loadProvider, transcodeClass, other.glide, other.requestTracker, + this(other.context, other.modelClass, loadProvider, transcodeClass, other.glide, other.requestTracker, other.lifecycle); this.signature = other.signature; this.diskCacheStrategy = other.diskCacheStrategy; this.isCacheable = other.isCacheable; + this.model = other.model; + this.isModelSet = other.isModelSet; } - GenericRequestBuilder(Context context, ModelType model, + GenericRequestBuilder(Context context, Class<ModelType> modelClass, LoadProvider<ModelType, DataType, ResourceType, TranscodeType> loadProvider, Class<TranscodeType> transcodeClass, Glide glide, RequestTracker requestTracker, Lifecycle lifecycle) { this.context = context; - this.model = model; + this.modelClass = modelClass; this.transcodeClass = transcodeClass; this.glide = glide; this.requestTracker = requestTracker; @@ -101,7 +102,7 @@ public class GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeT if (context == null) { throw new NullPointerException("Context can't be null"); } - if (model != null && loadProvider == null) { + if (modelClass != null && loadProvider == null) { throw new NullPointerException("LoadProvider must not be null"); } } @@ -542,6 +543,24 @@ public class GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeT } /** + * Sets the specific model to load data for. + * + * <p> + * This method must be called at least once before {@link #into(com.bumptech.glide.request.target.Target)} is + * called. + * </p> + * + * @param model The model to load data for, or null. + * @return This request builder. + */ + public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> load(ModelType model) { + this.model = model; + isModelSet = true; + return this; + } + + + /** * Set the target the resource will be loaded into. * * @see Glide#clear(com.bumptech.glide.request.target.Target) @@ -554,6 +573,9 @@ public class GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeT if (target == null) { throw new IllegalArgumentException("You must pass in a non null Target"); } + if (!isModelSet) { + throw new IllegalArgumentException("You must first set a model (try #load())"); + } Request previous = target.getRequest(); diff --git a/library/src/main/java/com/bumptech/glide/GenericTranscodeRequest.java b/library/src/main/java/com/bumptech/glide/GenericTranscodeRequest.java index 4274cb6e..9c0b4efa 100644 --- a/library/src/main/java/com/bumptech/glide/GenericTranscodeRequest.java +++ b/library/src/main/java/com/bumptech/glide/GenericTranscodeRequest.java @@ -53,11 +53,11 @@ public class GenericTranscodeRequest<ModelType, DataType, ResourceType> this.optionsApplier = optionsApplier; } - GenericTranscodeRequest(Context context, Glide glide, ModelType model, ModelLoader<ModelType, DataType> modelLoader, - Class<DataType> dataClass, Class<ResourceType> resourceClass, RequestTracker requestTracker, - Lifecycle lifecycle, RequestManager.OptionsApplier optionsApplier) { - super(context, model, build(glide, modelLoader, dataClass, resourceClass, UnitTranscoder.<ResourceType>get()), - resourceClass, glide, requestTracker, lifecycle); + GenericTranscodeRequest(Context context, Glide glide, Class<ModelType> modelClass, + ModelLoader<ModelType, DataType> modelLoader, Class<DataType> dataClass, Class<ResourceType> resourceClass, + RequestTracker requestTracker, Lifecycle lifecycle, RequestManager.OptionsApplier optionsApplier) { + super(context, modelClass, build(glide, modelLoader, dataClass, resourceClass, + UnitTranscoder.<ResourceType>get()), resourceClass, glide, requestTracker, lifecycle); this.modelLoader = modelLoader; this.dataClass = dataClass; this.resourceClass = resourceClass; @@ -77,9 +77,8 @@ public class GenericTranscodeRequest<ModelType, DataType, ResourceType> LoadProvider<ModelType, DataType, ResourceType, TranscodeType> loadProvider = build(glide, modelLoader, dataClass, resourceClass, transcoder); - return optionsApplier.apply(model, - new GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType>(loadProvider, - transcodeClass, this)); + return optionsApplier.apply(new GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType>( + loadProvider, transcodeClass, this)); } /** @@ -101,7 +100,7 @@ public class GenericTranscodeRequest<ModelType, DataType, ResourceType> DataLoadProvider<DataType, File> dataLoadProvider = glide.buildDataProvider(dataClass, File.class); FixedLoadProvider<ModelType, DataType, File, File> fixedLoadProvider = new FixedLoadProvider<ModelType, DataType, File, File>(modelLoader, transcoder, dataLoadProvider); - return optionsApplier.apply(model, new GenericRequestBuilder<ModelType, DataType, File, File>(fixedLoadProvider, + return optionsApplier.apply(new GenericRequestBuilder<ModelType, DataType, File, File>(fixedLoadProvider, File.class, this)) .priority(Priority.LOW) .diskCacheStrategy(DiskCacheStrategy.SOURCE) diff --git a/library/src/main/java/com/bumptech/glide/GifRequestBuilder.java b/library/src/main/java/com/bumptech/glide/GifRequestBuilder.java index de9330f5..5e63549d 100644 --- a/library/src/main/java/com/bumptech/glide/GifRequestBuilder.java +++ b/library/src/main/java/com/bumptech/glide/GifRequestBuilder.java @@ -398,6 +398,12 @@ public class GifRequestBuilder<ModelType> } @Override + public GifRequestBuilder<ModelType> load(ModelType model) { + super.load(model); + return this; + } + + @Override void applyFitCenter() { fitCenter(); } diff --git a/library/src/main/java/com/bumptech/glide/GifTypeRequest.java b/library/src/main/java/com/bumptech/glide/GifTypeRequest.java index bded0f99..7fd20898 100644 --- a/library/src/main/java/com/bumptech/glide/GifTypeRequest.java +++ b/library/src/main/java/com/bumptech/glide/GifTypeRequest.java @@ -62,8 +62,8 @@ public class GifTypeRequest<ModelType> extends GifRequestBuilder<ModelType> { ResourceTranscoder<GifDrawable, R> transcoder, Class<R> transcodeClass) { FixedLoadProvider<ModelType, InputStream, GifDrawable, R> provider = buildProvider(glide, streamModelLoader, transcodeClass, transcoder); - return optionsApplier.apply(model, - new GenericRequestBuilder<ModelType, InputStream, GifDrawable, R>(provider, transcodeClass, this)); + return optionsApplier.apply(new GenericRequestBuilder<ModelType, InputStream, GifDrawable, R>(provider, + transcodeClass, this)); } /** diff --git a/library/src/main/java/com/bumptech/glide/RequestManager.java b/library/src/main/java/com/bumptech/glide/RequestManager.java index 65d216c6..80853404 100644 --- a/library/src/main/java/com/bumptech/glide/RequestManager.java +++ b/library/src/main/java/com/bumptech/glide/RequestManager.java @@ -85,11 +85,10 @@ public class RequestManager implements LifecycleListener { /** * Allows the implementor to apply some options to the given request. * - * @param model The model that is being loaded. * @param requestBuilder The request builder being used to construct the load. * @param <T> The type of the model. */ - <T> void apply(T model, GenericRequestBuilder<T, ?, ?, ?> requestBuilder); + <T> void apply(GenericRequestBuilder<T, ?, ?, ?> requestBuilder); } /** @@ -328,8 +327,9 @@ public class RequestManager implements LifecycleListener { ModelLoader<Uri, ParcelFileDescriptor> fileDescriptorModelLoader = Glide.buildFileDescriptorModelLoader(uri, context); - return optionsApplier.apply(uri, new DrawableTypeRequest<Uri>(uri, mediaStoreLoader, - fileDescriptorModelLoader, context, glide, requestTracker, lifecycle, optionsApplier)); + return (DrawableTypeRequest<Uri>) optionsApplier.apply(new DrawableTypeRequest<Uri>(Uri.class, mediaStoreLoader, + fileDescriptorModelLoader, context, glide, requestTracker, lifecycle, optionsApplier)) + .load(uri); } /** @@ -461,6 +461,7 @@ public class RequestManager implements LifecycleListener { return loadGeneric(model); } + @SuppressWarnings("unchecked") private <T> DrawableTypeRequest<T> loadGeneric(T model) { ModelLoader<T, InputStream> streamModelLoader = Glide.buildStreamModelLoader(model, context); ModelLoader<T, ParcelFileDescriptor> fileDescriptorModelLoader = @@ -470,8 +471,16 @@ public class RequestManager implements LifecycleListener { + " which there is a registered ModelLoader, if you are using a custom model, you must first call" + " Glide#register with a ModelLoaderFactory for your custom model class"); } - return optionsApplier.apply(model, new DrawableTypeRequest<T>(model, streamModelLoader, - fileDescriptorModelLoader, context, glide, requestTracker, lifecycle, optionsApplier)); + + return (DrawableTypeRequest<T>) optionsApplier.apply( + new DrawableTypeRequest<T>(getSafeClass(model), streamModelLoader, fileDescriptorModelLoader, context, + glide, requestTracker, lifecycle, optionsApplier)) + .load(model); + } + + @SuppressWarnings("unchecked") + private static <T> Class<T> getSafeClass(T model) { + return model != null ? (Class<T>) model.getClass() : null; } /** @@ -488,8 +497,9 @@ public class RequestManager implements LifecycleListener { } public DrawableTypeRequest<T> load(T model) { - return optionsApplier.apply(model, new DrawableTypeRequest<T>(model, null, loader, context, - glide, requestTracker, lifecycle, optionsApplier)); + return (DrawableTypeRequest<T>) optionsApplier.apply(new DrawableTypeRequest<T>(getSafeClass(model), null, + loader, context, glide, requestTracker, lifecycle, optionsApplier)) + .load(model); } } @@ -507,8 +517,9 @@ public class RequestManager implements LifecycleListener { } public DrawableTypeRequest<T> load(T model) { - return optionsApplier.apply(model, new DrawableTypeRequest<T>(model, loader, null, context, - glide, requestTracker, lifecycle, optionsApplier)); + return (DrawableTypeRequest<T>) optionsApplier.apply(new DrawableTypeRequest<T>(getSafeClass(model), loader, + null, context, glide, requestTracker, lifecycle, optionsApplier)) + .load(model); } } @@ -559,17 +570,19 @@ public class RequestManager implements LifecycleListener { * @return This request builder. */ public <Z> GenericTranscodeRequest<A, T, Z> as(Class<Z> resourceClass) { - return optionsApplier.apply(model, new GenericTranscodeRequest<A, T, Z>(context, glide, model, - modelLoader, dataClass, resourceClass, requestTracker, lifecycle, optionsApplier)); + return (GenericTranscodeRequest<A, T, Z>) optionsApplier.apply( + new GenericTranscodeRequest<A, T, Z>(context, glide, getSafeClass(model), modelLoader, + dataClass, resourceClass, requestTracker, lifecycle, optionsApplier)) + .load(model); } } } class OptionsApplier { - public <A, X extends GenericRequestBuilder<A, ?, ?, ?>> X apply(A model, X builder) { + public <A, X extends GenericRequestBuilder<A, ?, ?, ?>> X apply(X builder) { if (options != null) { - options.apply(model, builder); + options.apply(builder); } return builder; } |