Glide 3.4.0
Glide 3.4 is an incremental release containing a number of new features and bugfixes. Animated GIFs were a significant focus of this release. We've substantially increased the number of GIFs that can be decoded successfully by our GifDecoder and fixed a variety of smaller issues with rendering and in our decoding pipeline in older versions of Android.
You can also see a complete list of issues in the corresponding milestone.
Features
- Allow RequestBuilders to be re-used for multiple loads by introducing the
.from()
and.clone()
APIs. These APIs allow users to set options on a request builder once, pass the builder to their adapters, and then start multiple loads with the single builder (#182).
// In your Activity/Fragment
@Override
public void onCreate(Bundle savedInstanceState) {
DrawableRequestBuilder requestBuilder =
Glide.with(this)
.from(String.class)
.placeholder(R.drawable.spinner)
.centerCrop()
.crossFade();
mAdapter = new MyAdapter(requestBuilder);
}
// In your Adapter
@Override
public View getView(int position, View convertView, ViewGroupParent parent) {
...
mRequestBuilder.load(myUrls.get(position)).into(convertView);
}
- Add a method to GlideBuilder to set a global decode format (#177), see the configuration wiki.
Glide.setup(new GlideBuilder(context)
.setDecodeFormat(DecodeFormat.ALWAYS_ARGB_8888));
- Add a
.preload()
API to allow preloading media into memory (#169).
Glide.with(fragment)
.load(url)
.preload(width, height);
- Add a
.signature()
API to allow users to easily mix in additional data to cache keys, giving users more control over cache invalidation (#178, #179), see the cache invalidation wiki.
Glide.with(fragment)
.load(url)
.signature(new StringSignature("Version1"))
.into(view);
- Add a
Glide.preFillBitmapPool()
API to allow pre-filling the BitmapPool to avoid jank from allocations after app startup (#93).
Glide.get(context)
.preFillBitmapPool(new PreFillType.Builder(mySize));
- Allow recursive calls to
thumbnail()
to load an arbitrary number of different sized thumbnails for a single Target (#149).
Glide.with(fragment)
.load(myUrl)
.thumbnail(Glide.with(fragment)
.load(myUrl)
.override(200, 200)
.thumbnail(Glide.with(fragment)
.load(myUrl)
.override(50, 50)))
.into(myView);
- Allow
thumbnail()
to load model and data types that are different than those of the parent (#107). - Transformations are now only applied once and no longer have to be idempotent (#112).
Build/Infrastructure
- PMD/Findbugs (#164)
- Jacoco/Coveralls with 85% test coverage (34f797b).
- Standard import order (f7a6d65).
Bugs
Performance
- Avoid allocating large byte arrays in
BufferedInputStream
(#225). - Use downsampled image size when obtaining Bitmaps from the pool (#224).
GIFs
- Avoid a crash causing race decoding multiple frames with the same GifDecoder (#212).
- Always use
ARGB_8888
to prevent null GIF frames on some versions of Android that don’t supportARGB_4444
(#216). - Fix partially decoded GIF frames (appears as grey or transparent noise in frames) (#207, #204).
- Set a default frame delay for GIFs which do not specify a frame delay, or specify an overly short frame delay (#205).
- More robust GIF decoding logic, including a fix for decoding only the first few rows of certain GIFs (#203).
- Allow fade in/cross fade animations by ensuring that the first frame of GIFs is decoded before the GIF is returned (#159).
- Fix GIFs always appearing transparent pre KitKat (#199).
Memory
- Fix a memory leak when Glide is first called in an Activity (#210).
Transformations
- Fix underdraw in
FitCenter
causing noise along the sides of certain images (#195). - Maintain transparency during bitmap transformations (#156).
Caching
- Fixed Drawables being cached only be integer resource id which can change and/or overlap after subsequent compilations (#172).
Uris
- Fix failure to detect certain types of file Uris (#161).
Other
- Fix concurrency bugs resulting in incorrect assertions being thrown when loads were started on multiple threads (#191, #181).
- Fix
BitmapRequestBuilder
not setting the decode format on the cache decoder whenformat()
is called (#187). - Fix an assertion in
ViewTarget
related to restarting requests (#167). - Fix
Glide.with()
throwing pre Honeycomb when given non-support Activities (#158). - Avoid using Closeable interface when loading ParcelFileDescriptors on 4.1.1 or earlier (#157).
- Fix an NPE in
Bitmap#getAllocationByteCount()
due to a framework bug in the initial release of KitKat (#148).